lzlinzhong 发表于 2020-6-12 23:03:20

关于爬取豆瓣电影【非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文件老是失败,写不进去为什么??

希望能有人帮助一下!

wp231957 发表于 2020-6-13 05:27:13

对子url继续进行get/post请求

wp231957 发表于 2020-6-13 05:28:51

至于csv文档,你可以单独坐一个写测试,看看到底是啥原因

suchocolate 发表于 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']['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)

lzlinzhong 发表于 2020-6-13 17:36:29

suchocolate 发表于 2020-6-13 12:38
用的etree,供你参考:

好的,我试一下,谢谢。

lzlinzhong 发表于 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)

suchocolate 发表于 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先试试效果。

lzlinzhong 发表于 2020-6-13 20:20:28

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

可以到500,其实我本来想2000左右的,但是好像搞不定{:5_99:}

java2python 发表于 2020-6-13 21:22:31

豆瓣果然是250

lzlinzhong 发表于 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']['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文件的哪个编码

lzlinzhong 发表于 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:
这里这一句,编码方式改了一下

suchocolate 发表于 2020-6-14 14:59:15

lzlinzhong 发表于 2020-6-14 12:08
唉,我回复了三次,但是两次没通过审核不知道为啥,我改了一下

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

应该不是这个问题。
你是不是用了代理,昨天我也的你的代理不能用,你去掉代理试试。

lzlinzhong 发表于 2020-6-14 17:05:38

suchocolate 发表于 2020-6-14 14:59
应该不是这个问题。
你是不是用了代理,昨天我也的你的代理不能用,你去掉代理试试。

好了{:5_95:}谢谢!!!

lzlinzhong 发表于 2020-6-14 19:54:53

suchocolate 发表于 2020-6-14 14:59
应该不是这个问题。
你是不是用了代理,昨天我也的你的代理不能用,你去掉代理试试。

还想问一下,如果要搞到2000的数据的话,这个代码能爬吗?{:9_241:}

suchocolate 发表于 2020-6-14 19:58:22

lzlinzhong 发表于 2020-6-14 19:54
还想问一下,如果要搞到2000的数据的话,这个代码能爬吗?

应该可以,就看豆瓣有没有100页了。

lzlinzhong 发表于 2020-6-14 21:40:47

suchocolate 发表于 2020-6-14 19:58
应该可以,就看豆瓣有没有100页了。

还有一个小疑问是关于headers的设置,我在百度搜了也没有搜出来这么设置的解释,可以讲一下吗?感谢!!
headers={'User-Agent':'firefox'},为什么设置的是firefox?
如果再引入随即库,设置User-agent 列表,随机获取headers,可以这么修改吗?
{:9_241:}

suchocolate 发表于 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。

页: [1]
查看完整版本: 关于爬取豆瓣电影【非top250】的代码求助