豆瓣电影排行榜250(初学爬虫)
新手的爬虫练手项目 和 朋友一起学的 记录一下
我写的
'''题目:全250电影,爬取电影名,上映时间,国家,什么类型电影,电影评分,写入txt文件'''
#编码格式UTF-8
'''
1.导入相应的库 我们使用了requests库写爬虫,使用xpath解析格式,需导入lxml.etree这库把网址进行转换,导入了正则库进行预备处理防止出现xpath无法获取相应数据的情况
2.发现对应源码在HTML中,不需要寻找其他解析方式(如js)可直接进行xpath
3.获取网址,从抓包处拿去请求头(cookies可有可无)
4.xpath解析拿剩下所有页面网址
5.在循环中逐一遍历其余网址对其发起请求
'''
import requests
from lxml import etree
import re
s=1
url='https://movie.douban.com/top250'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'}
response=requests.get(url=url,headers=headers).text
response=etree.HTML(response)
name_list=[]
release_list=[]
score_list=[]
time_list=[]
type_list=[]
url_list=[]
url1=response.xpath('//*[@id="content"]/div/div[1]/div[2]/a/@href')
for i in url1:
i=url+i
url_list.append(i)
for next in range(len(url_list)+1):
name=response.xpath('//*[@id="content"]//a/span[1]/text()')
release=response.xpath('//*[@id="content"]//li//p/text()[2]')
score=response.xpath('//*[@id="content"]//li/div/div[2]/div[2]//span[2]/text()')
for i in name:
name_list.append(i)
# print('name',i)
for i in release:
i=str(i)
i=i.replace(' ','')
i=i.replace('\xa0','')
i=re.findall(r'.[^\n\s*\r]*',i)
if len(i)==0:
continue
i=str(i[0]).split('/')
time_list.append(i[0])
release_list.append(i[1])
type_list.append(i[2])
# print('release1',i)
for i in score:
score_list.append(i)
# print('score',i)
# print('score:',len(score_list),'\ntime:',len(time_list),'\nrelease:',len(release_list),'\ntype:',len(type_list),'\nname',len(name_list))
for i in range(len(name_list)):
with open('豆瓣电影.txt','a') as f:
f.write(f'电影名:{name_list[i]},上映时间:{time_list[i]},国籍:{release_list[i]},电影类型:{type_list[i]},评分:{score_list[i]}\n')
print((f'第{s}部电影 电影名:{name_list[i]},上映时间:{time_list[i]},国籍:{release_list[i]},电影类型:{type_list[i]},评分:{score_list[i]}'))
s+=1
name_list.clear()
release_list.clear()
score_list.clear()
type_list.clear()
time_list.clear()
try:
response = requests.get(url=url_list[next], headers=headers).text
response = etree.HTML(response)
except:
print('爬取结束')
朋友(毛写)
'''题目:爬取电影名,上映时间,类型,评分,'''
#编码格式UTF-8
'''
1.导入相应的库,request,xpath库;
2.构建请求头/cookies信息;
3.拿到并构建需要请求的网址;
4.使用request方法对网页发起请求并以字符串数据类型返回;
5.对响应进行网页加密;
6.对需要抓取的内容使用xpath定位的方式进行定位;
7.创建对应抓取数据的列表;
8.进行for循环遍历得到需要数据,之后对数据进行处理(i=i.replace(' ','').replace('\xa0','').strip('\n').split('/'))
9.以所需要的数据长度进行循环遍历并输出所需要的数据
10.清空列表之后构造第二页的网址对第二页网址再次请求,使用for循环达到自动翻页抓取其他页所需要的内容
'''
import requests
from lxml import etree
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'}
cookies='Cookie: ll="118355"; bid=AQcROvQM_-0; __utmz=30149280.1635691150.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmz=223695111.1635691150.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; _vwo_uuid_v2=DAC4AEB658F3F8304565CCBAC102645E4|b60ac4ec5c18b906c92005f0d491dcab; __gads=ID=312f4cbc309ccd40-225b041478ce004e:T=1635691211:RT=1635691211:S=ALNI_Mb_drSuv6VTfOA8K5UA66vUNdnTBw; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1636638852%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DR5QO0ju3rp727v2XkVIaGS4D1b5XNOcN93cVFB72mSVNEAEuPXTsM6sVIq6w2Dhy%26wd%3D%26eqid%3Dddb36f65000e014d00000006617eaa83%22%5D; _pk_id.100001.4cf6=4f270bc5287bb024.1635691150.3.1636638852.1635834486.; _pk_ses.100001.4cf6=*; __utma=30149280.1526461759.1635691150.1635834486.1636638852.3; __utmb=30149280.0.10.1636638852; __utmc=30149280; __utma=223695111.414137717.1635691150.1635834486.1636638852.3; __utmb=223695111.0.10.1636638852; __utmc=223695111; ap_v=0,6.0'
cookies_l = {}
for i in cookies.split('; '):
i=i.split('=')
cookies_l[i[0]]=i[1]
url = 'https://movie.douban.com/top250'
response =requests.get(url=url,headers=headers,cookies=cookies_l).text
#https://movie.douban.com/top250?start=25&filter=
s=0
b=1
for a in range(10):
s+=25
response=etree.HTML(response)
name=response.xpath('//*[@id="content"]//div[1]/ol/li/div//a/span[1]/text()')
count=response.xpath('//*[@id="content"]/div/div/ol/li/div/div[2]/div[2]/div/span[2]/text()')
qita=response.xpath('//*[@id="content"]/div//ol/li/div//div[2]/p[1]/text()[2]') #xpath返回的数据类型是列表
riqi_list=[]
guojia_list=[]
leixing_list=[]
for i in qita:
i=i.replace(' ','').replace('\xa0','').strip('\n').split('/')
guojia_list.append(i[1])
riqi_list.append(i[0])
leixing_list.append(i[2])
for i in range(len(name)):
with open('豆瓣电影.txt','a')as f:
f.write('电影名字:{},评分:{},出品国家:{},上映时间:{},影片类型:{}\n'.format(name[i],count[i],guojia_list[i],riqi_list[i],leixing_list[i]))
print('第{}部电影 电影名字:{},评分:{},出品国家:{},上映时间:{},影片类型:{}'.format(b,name[i],count[i],guojia_list[i],riqi_list[i],leixing_list[i]))
b =b +1
leixing_list.clear()
riqi_list.clear()
guojia_list.clear()
url1 = f'https://movie.douban.com/top250?start={s}&filter='
# print(url1)
response =requests.get(url=url1,headers=headers,cookies=cookies_l).text
print('over!!')
这个是请求头 从浏览器 检查->network(网络)中获取
这个是网址解析 我们发现除第一页网址以外,之后网页就划线处数字不同
我的抓取方法是从第一步就抓取其余剩余网页的网址后半段 与第一网址组合放入一个列表中对其遍历
毛写的是改变数字每次加25进行翻页