关于爬取豆瓣电影【非top250】的代码求助
代码如下:import requests,csv,random
from bs4 import BeautifulSoup
csv_file=open('电影.csv', 'w', newline='',encoding='utf-8-sig')
writer = csv.writer(csv_file)
writer.writerow([ '电影名', '导演','演员','类型','地区','语言','上映日期','片长'])
header = {
'Host':'movie.douban.com',
'Origin':'movie.douban.com',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36',
}
proxies={"http":'163.204.240.175'}
def format_url(num):
urls=[]
base_url='https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=%E7%94%B5%E5%BD%B1&start={}'
for i in range(0,20*num,20):
url=base_url.format(i)
urls.append(url)
return urls
urls=format_url(500)
for url in urls:
html=requests.get(url,headers=header,proxies=proxies,timeout=5)
soup=BeautifulSoup(html.text,'lxml')
到此就不知道该怎么做了
这个print(soup)之后
出来的结果是有电影的名称,评分,导演,演员,还有电影的具体豆瓣页面的url,
但是我想要的是再进入这个url里边,
去获取到更多的信息,包括 电影的'类型','地区','语言','上映日期','片长'
然而到这里我就不知道该怎么做了
还有就是,写入csv文件老是失败,写不进去为什么??
希望能有人帮助一下!
对子url继续进行get/post请求 至于csv文档,你可以单独坐一个写测试,看看到底是啥原因 用的etree,供你参考:import requests
from lxml import etree
import re
import csv
base_url = 'https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=%E7%94%B5%E5%BD%B1&start='
headers = {'user-agent': 'firefox'}
tt = {}
for item in range(0, 500, 20):
url = base_url + '{}'.format(item)
r = requests.get(url, headers=headers)
data = r.json()
for x in range(0, 20):
key = data['data']['title']
tt = []
tt.append(key)
tt.append(data['data']['directors'])
item = data['data']['url']
r = requests.get(item, headers=headers)
html = etree.HTML(r.text)
info = html.xpath('//div[@id="info"]')
actors = info.xpath('//span/span//a/text()')
tt.append(actors)
types = info.xpath('//span[@property="v:genre"]/text()')
tt.append(types)
zones = re.findall('地区:</span>(.*?)<', r.text)
tt.append(zones)
lang = re.findall('语言:</span>(.*?)<', r.text)
tt.append(lang)
date = info.xpath('//span[@property="v:initialReleaseDate"]//text()')
tt.append(date)
leng = info.xpath('//span[@property="v:runtime"]/text()')
tt.append(leng)
with open('moive.csv', 'w') as f:
writer = csv.writer(f)
writer.writerow(['电影名', '导演', '演员', '类型', '地区', '语言', '上映日期', '片长'])
for item in tt.values():
writer.writerow(item) suchocolate 发表于 2020-6-13 12:38
用的etree,供你参考:
好的,我试一下,谢谢。 suchocolate 发表于 2020-6-13 12:38
用的etree,供你参考:
他报错了
Traceback (most recent call last):
File "C:/Users/Dell/Desktop/123.py", line 12, in <module>
data = r.json()
File "C:\Users\Dell\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\models.py", line 898, in json
return complexjson.loads(self.text, **kwargs)
File "C:\Users\Dell\AppData\Local\Programs\Python\Python37-32\lib\site-packages\simplejson\__init__.py", line 525, in loads
return _default_decoder.decode(s)
File "C:\Users\Dell\AppData\Local\Programs\Python\Python37-32\lib\site-packages\simplejson\decoder.py", line 370, in decode
obj, end = self.raw_decode(s)
File "C:\Users\Dell\AppData\Local\Programs\Python\Python37-32\lib\site-packages\simplejson\decoder.py", line 400, in raw_decode
return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 本帖最后由 suchocolate 于 2020-6-13 19:43 编辑
lzlinzhong 发表于 2020-6-13 18:34
他报错了
Traceback (most recent call last):
我这里正常,你有没有改什么代码?
如果有改动,再贴到这里。
另外500太大了,我是照着你是原代码改的,至于能不能到500不一定,我建议你改成40先试试效果。 suchocolate 发表于 2020-6-13 19:37
我这里正常,你有没有改什么代码?
如果有改动,再贴到这里。
另外500太大了,我是照着你是原代码改 ...
可以到500,其实我本来想2000左右的,但是好像搞不定{:5_99:} 豆瓣果然是250 suchocolate 发表于 2020-6-13 19:37
我这里正常,你有没有改什么代码?
如果有改动,再贴到这里。
另外500太大了,我是照着你是原代码改 ...
import requests
from lxml import etree
import re
import csv
base_url = 'https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=%E7%94%B5%E5%BD%B1&start=0&countries=%E4%BF%84%E7%BD%97%E6%96%AF'
headers = {'user-agent': 'firefox'}
tt = {}
for item in range(0, 500, 20):
url = base_url + '{}'.format(item)
r = requests.get(url, headers=headers)
data = r.json()
for x in range(0, 20):
key = data['data']['title']
tt = []
tt.append(key)
tt.append(data['data']['directors'])
item = data['data']['url']
r = requests.get(item, headers=headers)
html = etree.HTML(r.text)
info = html.xpath('//div[@id="info"]')
actors = info.xpath('//span/span//a/text()')
tt.append(actors)
types = info.xpath('//span[@property="v:genre"]/text()')
tt.append(types)
zones = re.findall('地区:</span>(.*?)<', r.text)
tt.append(zones)
lang = re.findall('语言:</span>(.*?)<', r.text)
tt.append(lang)
date = info.xpath('//span[@property="v:initialReleaseDate"]//text()')
tt.append(date)
leng = info.xpath('//span[@property="v:runtime"]/text()')
tt.append(leng)
with open('moive.csv', 'w',newline='',encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['电影名', '导演', '演员', '类型', '地区', '语言', '上映日期', '片长'])
for item in tt.values():
writer.writerow(item)
昨天的回复帖子没过审核,我改动了写入csv文件的哪个编码
suchocolate 发表于 2020-6-13 19:37
我这里正常,你有没有改什么代码?
如果有改动,再贴到这里。
另外500太大了,我是照着你是原代码改 ...
唉,我回复了三次,但是两次没通过审核不知道为啥,我改了一下
with open('moive.csv', 'w',newline='',encoding='utf-8-sig') as f:
这里这一句,编码方式改了一下 lzlinzhong 发表于 2020-6-14 12:08
唉,我回复了三次,但是两次没通过审核不知道为啥,我改了一下
这里这一句,编码方式改了一下
应该不是这个问题。
你是不是用了代理,昨天我也的你的代理不能用,你去掉代理试试。 suchocolate 发表于 2020-6-14 14:59
应该不是这个问题。
你是不是用了代理,昨天我也的你的代理不能用,你去掉代理试试。
好了{:5_95:}谢谢!!! suchocolate 发表于 2020-6-14 14:59
应该不是这个问题。
你是不是用了代理,昨天我也的你的代理不能用,你去掉代理试试。
还想问一下,如果要搞到2000的数据的话,这个代码能爬吗?{:9_241:} lzlinzhong 发表于 2020-6-14 19:54
还想问一下,如果要搞到2000的数据的话,这个代码能爬吗?
应该可以,就看豆瓣有没有100页了。 suchocolate 发表于 2020-6-14 19:58
应该可以,就看豆瓣有没有100页了。
还有一个小疑问是关于headers的设置,我在百度搜了也没有搜出来这么设置的解释,可以讲一下吗?感谢!!
headers={'User-Agent':'firefox'},为什么设置的是firefox?
如果再引入随即库,设置User-agent 列表,随机获取headers,可以这么修改吗?
{:9_241:} 本帖最后由 suchocolate 于 2020-6-15 08:33 编辑
lzlinzhong 发表于 2020-6-14 21:40
还有一个小疑问是关于headers的设置,我在百度搜了也没有搜出来这么设置的解释,可以讲一下吗?感谢!!
...
user-agent是http请求时必须加的一个字段,用以表示发起http请求的client是什么。(想了解http可以买本《图解HTTP》)
user-agent的内容其实写什么都可以,但我们写脚本如果不加,requests默认会写python-requests,这样网站就知道是爬虫,果断拒绝,所以我们要加。
随机不随机也只是防止被反扒的手段,这个随意。
下面是requests默认加的user-agent。
页:
[1]