鱼C论坛

 找回密码
 立即注册
查看: 1352|回复: 16

[已解决]关于爬取豆瓣电影【非top250】的代码求助

[复制链接]
发表于 2020-6-12 23:03:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下:

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文件老是失败,写不进去为什么??

希望能有人帮助一下!
最佳答案
2020-6-13 12:38:01
用的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'][x]['title']
        tt[key] = []
        tt[key].append(key)
        tt[key].append(data['data'][x]['directors'][0])
        item = data['data'][x]['url']
        r = requests.get(item, headers=headers)
        html = etree.HTML(r.text)
        info = html.xpath('//div[@id="info"][1]')[0]
        actors = info.xpath('//span[3]/span[2]//a/text()')
        tt[key].append(actors)
        types = info.xpath('//span[@property="v:genre"]/text()')
        tt[key].append(types)
        zones = re.findall('地区:</span>(.*?)<', r.text)
        tt[key].append(zones)
        lang = re.findall('语言:</span>(.*?)<', r.text)
        tt[key].append(lang)
        date = info.xpath('//span[@property="v:initialReleaseDate"]//text()')
        tt[key].append(date)
        leng = info.xpath('//span[@property="v:runtime"]/text()')
        tt[key].append(leng)
with open('moive.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerow(['电影名', '导演', '演员', '类型', '地区', '语言', '上映日期', '片长'])
    for item in tt.values():
        writer.writerow(item)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-13 05:27:13 From FishC Mobile | 显示全部楼层
对子url继续进行get/post请求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-13 05:28:51 From FishC Mobile | 显示全部楼层
至于csv文档,你可以单独坐一个写测试,看看到底是啥原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-13 12:38:01 | 显示全部楼层    本楼为最佳答案   
用的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'][x]['title']
        tt[key] = []
        tt[key].append(key)
        tt[key].append(data['data'][x]['directors'][0])
        item = data['data'][x]['url']
        r = requests.get(item, headers=headers)
        html = etree.HTML(r.text)
        info = html.xpath('//div[@id="info"][1]')[0]
        actors = info.xpath('//span[3]/span[2]//a/text()')
        tt[key].append(actors)
        types = info.xpath('//span[@property="v:genre"]/text()')
        tt[key].append(types)
        zones = re.findall('地区:</span>(.*?)<', r.text)
        tt[key].append(zones)
        lang = re.findall('语言:</span>(.*?)<', r.text)
        tt[key].append(lang)
        date = info.xpath('//span[@property="v:initialReleaseDate"]//text()')
        tt[key].append(date)
        leng = info.xpath('//span[@property="v:runtime"]/text()')
        tt[key].append(leng)
with open('moive.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerow(['电影名', '导演', '演员', '类型', '地区', '语言', '上映日期', '片长'])
    for item in tt.values():
        writer.writerow(item)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-13 17:36:29 | 显示全部楼层
suchocolate 发表于 2020-6-13 12:38
用的etree,供你参考:

好的,我试一下,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-13 18:34:42 | 显示全部楼层
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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-13 19:37:05 | 显示全部楼层
本帖最后由 suchocolate 于 2020-6-13 19:43 编辑
lzlinzhong 发表于 2020-6-13 18:34
他报错了

Traceback (most recent call last):


我这里正常,你有没有改什么代码?
如果有改动,再贴到这里。
另外500太大了,我是照着你是原代码改的,至于能不能到500不一定,我建议你改成40先试试效果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-13 20:20:28 | 显示全部楼层
suchocolate 发表于 2020-6-13 19:37
我这里正常,你有没有改什么代码?
如果有改动,再贴到这里。
另外500太大了,我是照着你是原代码改 ...

可以到500,其实我本来想2000左右的,但是好像搞不定
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-13 21:22:31 | 显示全部楼层
豆瓣果然是250
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-14 12:07:16 | 显示全部楼层
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'][x]['title']
        tt[key] = []
        tt[key].append(key)
        tt[key].append(data['data'][x]['directors'][0])
        item = data['data'][x]['url']
        r = requests.get(item, headers=headers)
        html = etree.HTML(r.text)
        info = html.xpath('//div[@id="info"][1]')[0]
        actors = info.xpath('//span[3]/span[2]//a/text()')
        tt[key].append(actors)
        types = info.xpath('//span[@property="v:genre"]/text()')
        tt[key].append(types)
        zones = re.findall('地区:</span>(.*?)<', r.text)
        tt[key].append(zones)
        lang = re.findall('语言:</span>(.*?)<', r.text)
        tt[key].append(lang)
        date = info.xpath('//span[@property="v:initialReleaseDate"]//text()')
        tt[key].append(date)
        leng = info.xpath('//span[@property="v:runtime"]/text()')
        tt[key].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文件的哪个编码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-14 12:08:53 | 显示全部楼层
suchocolate 发表于 2020-6-13 19:37
我这里正常,你有没有改什么代码?
如果有改动,再贴到这里。
另外500太大了,我是照着你是原代码改 ...

唉,我回复了三次,但是两次没通过审核不知道为啥,我改了一下
with open('moive.csv', 'w',newline='',encoding='utf-8-sig') as f:
这里这一句,编码方式改了一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-14 14:59:15 | 显示全部楼层
lzlinzhong 发表于 2020-6-14 12:08
唉,我回复了三次,但是两次没通过审核不知道为啥,我改了一下

这里这一句,编码方式改了一下

应该不是这个问题。
你是不是用了代理,昨天我也的你的代理不能用,你去掉代理试试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-14 17:05:38 | 显示全部楼层
suchocolate 发表于 2020-6-14 14:59
应该不是这个问题。
你是不是用了代理,昨天我也的你的代理不能用,你去掉代理试试。

好了谢谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-14 19:54:53 | 显示全部楼层
suchocolate 发表于 2020-6-14 14:59
应该不是这个问题。
你是不是用了代理,昨天我也的你的代理不能用,你去掉代理试试。

还想问一下,如果要搞到2000的数据的话,这个代码能爬吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-14 19:58:22 | 显示全部楼层
lzlinzhong 发表于 2020-6-14 19:54
还想问一下,如果要搞到2000的数据的话,这个代码能爬吗?

应该可以,就看豆瓣有没有100页了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-14 21:40:47 | 显示全部楼层
suchocolate 发表于 2020-6-14 19:58
应该可以,就看豆瓣有没有100页了。

还有一个小疑问是关于headers的设置,我在百度搜了也没有搜出来这么设置的解释,可以讲一下吗?感谢!!
headers={'User-Agent':'firefox'},为什么设置的是firefox?
如果再引入随即库,设置User-agent 列表,随机获取headers,可以这么修改吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 08:31:37 | 显示全部楼层
本帖最后由 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。
6.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 16:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表