一步一步学习专栏:Python爬取静态网页(猫眼top100),实力好文

一步一步学习专栏:静态网页爬取

阿巴阿巴阿巴

大家好,我是猕猴tou儿,我又回来了,这篇帖子将以猫眼电影榜单top100榜为例讲解爬取静态网址的基本思路与爬取方法。
一步一步学习专栏:Python爬取静态网页(猫眼top100),实力好文_第1张图片

环境

这也是我们的第一步:

import requests
import time
import re#正则
from lxml import etree#xpath
from bs4 import BeautifulSoup#bs4
import pandas as pd#数据框
简单介绍一下这次学习所需要的库

request库:实现对网站发送请求,进行基本身份认证。
re库:正则库,在正则里面可进行删减、替换、添加操作,当然在爬取网页的时候,也可以很精确地爬取对应位置。
bs4库:bs4库可解析html网页代码,在爬取前需要使用BeautifulSoup模块对原text进行解析转换处理,以得到’lxml’类型,便于后面用find_all实现对网页节点的对应搜索,以求得到所需要的字段。
lxml库:lxml库也是一个可以对网页html网页代码进行解析的一个库,这里主要使用的是etree.HTML(text)将字符串格式的 html 片段解析成 html 文档,来构造了一个XPath解析对象,用Xpath工具实现对所需字段的爬取。
time库:time库是Python里处理时间的标准库,在这次的学习中主要使用的是时间休眠time.sleep()。
pandas库:pandas库主要是做一些表格的操作,在这次的学习中也是使用它来使数据更加直观。
一步一步学习专栏:Python爬取静态网页(猫眼top100),实力好文_第2张图片
如果电脑使用是Anaconda的环境,基本上这些库都是自带好了的,使用的时候引入就好(拍擦是怎么样的我不知道,但是我用的jupyter还是不错),分享一个打代码的快捷补充代码的按键’Tab’,这个按键在word里面是缩进,当然在Jupyter里word可以使用快捷键大多数都可以支持,譬如:Ctrl+c复制、Ctrl+v粘贴、Ctrl+z撤销上一步,这些快捷键便于我们写代码与编写爬虫。

设置headers与url

设置headers的主要作用是为了给访问网页的一个身份证明,这样可以在一些特定的网站上获取更多的内容,当然有些网站爬取时不设置headers访问状态码也是200(200代表访问成功),但是为了严谨我们会设置。

url="https://maoyan.com/board/4?offset=0"
h={'Cookie':'__mta=146659211.1592540528981.1592540547213.1592540549962.7; uuid_n_v=v1; uuid=6E511990B1E411EA95E3C92BBC8FF0199C2FCB8FA30740A6832DA0EEB9325063; _csrf=8937778cd7e9c7c5773063c88e52fb16b536e59a63e106fcb6eadb48d92464e5; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; _lxsdk_cuid=172cad0002ec8-0275aa4cddc0f-d373666-1fa400-172cad0002e9; _lxsdk=6E511990B1E411EA95E3C92BBC8FF0199C2FCB8FA30740A6832DA0EEB9325063; Hm_lvt_703e94591e87be68cc8da0da7cbd0be2=1592540529; mojo-uuid=c775a8854d972c1e87bb76aca7ecd294; mojo-session-id={"id":"beac7098dd5d404b60798771ada6080e","time":1592540528957}; __mta=146659211.1592540528981.1592540528981.1592540531592.2; mojo-trace-id=13; Hm_lpvt_703e94591e87be68cc8da0da7cbd0be2=1592540550; _lxsdk_s=172cad0002f-0a7-55-498%7C%7C16',
  'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}

爬取静态网页就写cookies与User-Agent这两个基本上就够了,cookies与User-Agent在所爬取网页上右键检查,用谷歌浏览器的话(火狐的话应该在下端),在最右边会新出现一个框,点击第四个Netword进去刷新一下,在Headers这个子框里面就可以找到这两个(当然也可以在这块得到网站的url)
一步一步学习专栏:Python爬取静态网页(猫眼top100),实力好文_第3张图片
复制过来整理一下headers就算写好了,这里也没有什么坑,就是要注意复制的时候应该要复制对,同时要注意用引号把cookie与User-Agent及他们对应内容引起来,与对应内容之间连接需要用冒号连接,建议把对应内容前的空格删去以求规范(实际上后面requests.get()的报错很少是空格引起的),两个部分中间用逗号连接,这里使用了回车是为了便于检查。url的获取可以直接双击网址,待所有内容出来复制粘贴就好,整理与前面headers的那两个差不多。headers与url的命名不讲究,只要与后文的requests.get()里对应就好。把这些写完检查好,这一项就算写完了。

requests.get()请求网站

这也是爬虫正式访问网站的第一步,在这里我们的请求方式是get请求,关于这个请求方式,也可以通过前文说到的Netword的子框Headers那块可以看到.

q=requests.get(url,headers=h)

这里也就是刚刚说到的一一对应,括号里前面是网址,后面是headers,用逗号连接,这里来命名q,方面与后文叙述。

解析网页

前面的操作爬虫已经访问到网页,可以通过q.text来获取网页的内容,如果我们使用的是正则爬取的话解析网页这个步骤就可以略去。但是如果采用BeautifulSoup爬取或者是Xpath工具来爬取的话,就需要对q.text进行解析转换处理。

jx=BeautifulSoup(q.text,'lxml')#BeautifulSoup
Jx=etree.HTML(q.text)#Xpath

这里是没有什么坑的,唯一要注意的是print(r.text)查看网页内容时,看看有没有乱码,如果有,需要q.encoding=''更改编码格式(基本上utf8与gbk就可以解决大部分的乱码),可以自己多试一下,再进行解析操作。

选择爬取内容,编写爬虫代码

在最早的学习中,我习惯看q.text来找爬取内容的规律,但是后面我发现了一个比较方便的方法还是在原网页上右键检查元素(新思路),对应的网站原内容就会出现,就可以很快找到我们需要爬取的内容,比如我们需要排行榜上的电影名数据。
一步一步学习专栏:Python爬取静态网页(猫眼top100),实力好文_第4张图片
有一定基础的同学,就会发现简单的一,我们这里示范一下如何爬取‘活着’的代码。
一步一步学习专栏:Python爬取静态网页(猫眼top100),实力好文_第5张图片
因为我写匹配全部,列表的第一个就是我们所需要的”活着”,这里的坑还是比较多的,但是多注意就可以避免,譬如:正则识别要注意.*?的使用,可以让代码简洁。引号中的括号里是爬取对象,引号里除去括号外是规则(我习惯叫规则,实际是为了正则匹配用的)外写逗号跟使用正则对象,re.S的作用是为了排除回车的干扰; BeautifulSoup与Xpath爬取注意节点的嵌套快速定位,从而爬取所需信息,要注意两者爬取可识别的文件不同。

多网页爬取的思想植入

上面的步骤已经将单页面网站部分信息爬出来了,这里要补充是多页网站的爬取,我是比较喜欢先把散的写好,再嵌套循环整和为组合代码。嵌套循环也是多页网址爬取的灵魂所在,这里想爬取整个排行榜的数据,需要翻页,让我们观察几页的网站规律:

https://maoyan.com/board/4?offset=0
https://maoyan.com/board/4?offset=20
https://maoyan.com/board/4?offset=30
https://maoyan.com/board/4?offset=30

发现每点击一次下一页,网址就会变化一次,于是可以编辑循环,网址共有10页,可以编辑网址的列表:

url=[]
for i in range(10):
    url.append('https://maoyan.com/board/4?offset='+str(i*10))

查看url列表,效果理想
一步一步学习专栏:Python爬取静态网页(猫眼top100),实力好文_第6张图片当得到网页的网址,多网页爬取的问题变成了单网页爬取的问题,建立空列表储存数据,编辑循环。

正则爬取
dym1=[]
zy1=[]
sysj1=[]
pf1=[]
start=time.time()
size=0
for k1 in url:
    q1=requests.get(k1,headers=h)
    jk1=q1
    print("正在爬取:"+k1)
    dym1=dym1+re.findall('data-val="{movieId:.*?}">(.*?)

'
,jk1.text) zy1=zy1+re.findall('

(.*?)

'
,jk1.text,re.S) sysj1=sysj1+re.findall('

(.*?)

'
,jk1.text) pf1=pf1+re.findall('

(.*?)

'
,jk1.text)#这块要写淘宝麻烦的列表循环,我不想写,就把中间那串一起取了 for s1 in range(len(zy1)): zy1[s1]=re.sub('\n|\s|主演:','',zy1[s1]) for s2 in range(len(sysj1)): sysj1[s2]=re.sub('上映时间:','',sysj1[s2]) for s3 in range(len(pf1)): pf1[s3]=re.sub('','',pf1[s3])#去掉之前取的那串我们不需要的 time.sleep(1) end=time.time() print("爬取完成总耗时:"+str(end-start)+"秒")
BeautifulSoup爬取
dym2=[]
zy2=[]
sysj2=[]
pf2=[]
start=time.time()
size=0
for k2 in url:
    q2=requests.get(k2,headers=h)
    jx2=BeautifulSoup(q2.text,'lxml')
    print("正在爬取:"+k2)
    dym2=dym2+[p1.text for p1 in jx2.find_all(name='p',class_='name')]
    zy2=zy2+[p2.text for p2 in jx2.find_all(name='p',class_='star')]
    sysj2=sysj2+[p3.text for p3 in jx2.find_all(name='p',class_='releasetime')]
    pf2=pf2+[p4.text for p4 in jx2.find_all(name='p',class_='score')]
    for ss1 in range(len(zy2)):
        zy2[ss1]=re.sub('\n|\s|主演:','',zy2[ss1])
    for ss2 in range(len(sysj2)):
        sysj2[ss2]=re.sub('上映时间:','',sysj2[ss2])
    time.sleep(1)
end=time.time()
print("爬取完成总耗时:"+str(end-start)+"秒")
xpath爬取
dym3=[]
zy3=[]
sysj3=[]
pf3=[]
pf33=[]
start=time.time()
size=0
for k3 in url:
    q3=requests.get(k3,headers=h)
    jx3=etree.HTML(q3.text)
    print("正在爬取:"+k3)
    dym3=dym3+jx3.xpath('//dl/dd/div/div/div[1]/p[1]/a/text()')
    zy3=zy3+jx3.xpath('//dl/dd/div/div/div[1]/p[2]/text()')
    sysj3=sysj3+jx3.xpath('//dl/dd/div/div/div[1]/p[3]/text()')
    pf3=pf3+jx3.xpath('//dl/dd/div/div/div[2]/p/i[1]/text()')
    pf33=pf33+jx3.xpath('//dl/dd/div/div/div[2]/p/i[2]/text()')#跟上次的问题差不多,这个我可以回头建表格的时候想办法处理掉不要紧,之前的也可以这样解决。
    for sss1 in range(len(zy3)):
        zy3[sss1]=re.sub('\n|\s|主演:','',zy3[sss1])
    for sss2 in range(len(sysj3)):
        sysj3[sss2]=re.sub('上映时间:','',sysj3[sss2])
    time.sleep(1)
end=time.time()
print("爬取完成总耗时:"+str(end-start)+"秒")

这里主要是一些循环的嵌套,我比较喜欢在爬取的时候就把文字处理掉,这个在转成表格再处理也没有关系。主要是循环的思路,这个要清晰,比较好的一个方法:想象自己是一个爬虫,每一行代码都代表什么,自己在做什么,慢慢的,不仅仅是每一行代码,还有循环都是可以理解的。

构建字典,转换为数据框形式

上面的操作做完,我们已经得到了所有排行榜的数据,现在要做的就是数据的输出,这里需要使用的是pandas库,我举的这个xpath爬取的例子评分是有问题的,主要是为了举个数据框处理的例子。

zd={'电影名':dym3,'主演':zy3,'上映时间':sysj3,'评分前半部分':pf3,'评分后半部分':pf33}
bg=pd.DataFrame(zd)
bg

一步一步学习专栏:Python爬取静态网页(猫眼top100),实力好文_第7张图片这里需要注意的地方是字典需要写花括号,字典对应在引号里,原始在后,中间用冒号连接。

数据框处理

bg['评分']=bg['评分前半部分']+bg['评分后半部分']#添加新的行'评分'
sc=[3,4]#定位
bg.drop(bg.columns[sc],axis=1,inplace=True)#删除行'评分前半部分'与'评分后半部分'

一步一步学习专栏:Python爬取静态网页(猫眼top100),实力好文_第8张图片

导出表格

bg.to_excel('C:\\Users\\admin\\Desktop\\猫眼top100.xlsx',encoding='utf_8_sig')#输出excel

一步一步学习专栏:Python爬取静态网页(猫眼top100),实力好文_第9张图片

你可能感兴趣的:(学习贴,python,编程语言,xpath,大数据)