实践内容为:访问豆瓣电影Top250(豆瓣电影 Top 250),获取每部电影的中文片名、排名、评分及其对应的链接,按照“排名-中文片名-评分-链接”的格式显示在屏幕上。(根据需要可以自己添加)
在这里我们选用CSS选择器来获取标签,首先演示如何通过本地操作获取标签。
- 打开豆瓣电影Top250网页豆瓣电影 Top 250
- 在网页上右击我们所要获取的信息;
例如:要获取《肖申克的救赎》电影的导演,将鼠标移至该电影的导演处,右击鼠标出现。
3.点击检查,即可定位该信息在html网页源码的具体位置;
4.右击对应标签,选择Copy -> Copy selector,即可获得对应元素的CSS选择器
5.将复制得到的CSS选择器粘贴在soup.select()中即可。
完成标签获取的学习后,将开始实际操作(以下均默认你已经安装并配置好了Pycharm)
- 在PyCharm中新建工程包,命名为webCrawler;
- 在webCrawler工程下新建doubanCrawler文件夹;
- 在doubanCrawler文件夹下创建getTop250.py文件;
首先需要导入你进行爬虫要使用到的库
requests库是用来对你所要爬取网页进行发起请求(模拟用户访问网站行为)
BeautifulSoup是从bs4中导入的,用来解析请求到的超文本网页内容
time是因为在后面main函数中,为了避免频繁访问网页触发反爬虫机制,导致本地ip被封锁
之后,我们开始编写请求函数的内容,函数的目的是访问网页,并且把获取到的html内容,传出去。
这里的url是从main里传入,就是所要访问网页的域名。例如:https://xxxxx.com之类的
us也是由main里传入,us就是我们请求网页所需要的请求头,用来模拟用户访问。
将获取的超文本内容,以utf-8的格式重新编码。
把网页内容请求到手后,就要对网页的内容进行解析了
这里传入的html参数就是上一步请求网页所返回的参数
使用BeautifulSoup对超文本内容进行提取,提取格式为‘html.parser’
在这里所看到的如“#content>div>div.article>ol>li”就是我们在网页通过CSS选择器获取的标签
第一条的select是将当前网页的所有内容全部存储到这样一个变量内,为什么要用“#content>div>div.article>ol>li”,是因为我们通过对网页的html元素观察发现,当前页面的25个影片信息都在<li></li>标签内,所以使用这个的原因就是一次获取这25个影片的信息,再通过for循环的方式,逐个提取我们想得到的内容。
在for循环内,我们把要获取的内容先赋值给一个temp变量,再根据我们需要获得内容的标签,进行select,加上[0],表示只获取第一个位置的内容,并且对于除过链接的内容,我们都以get_text()来获取它的文本内容,对于链接,我们对网页元素的观察发现,其是属于href='xxxxxxxxx',所以我们获取链接时,使用get('href')。
最后将获取的信息打印出来。
最后的主体就是main,来启动上面的这些操作。
可以在开始的位置放一个启动标志,方便查看是否程序运行(个人习惯,有时候print也是个不错的debug方法),这里的ua就是传入请求网页里的请求头,获取方法,我们在下面给出,在main中设置for循环的作用是,因为豆瓣网页每一个页面只有25个影片的信息,并且观察不同网页间的域名发现,是存在规律的:
所以如果我们想要获取影片的全部内容,就需要在这个地方设置一个循环,来对url进行逐轮修改。
前面提到,为了避免频繁访问触发反爬虫机制,所以我们每获取一次就休息一秒。
将两个函数进行安置,一个入门的简单爬虫程序就完成了。
请求头的获取方式如下:
在刚才获取内容标签的位置,我们去点击‘网络’(谷歌浏览器点击network)
再选择一个内容,点击(如果没有内容,使用F5刷新一下就好了)
最右侧滑动到最下面,你会发现User-Agent,这就是请求头
完整代码如下:
import requests from bs4 import BeautifulSoup import time #请求网页 def page_request(url,us): response=requests.get(url,headers=us) html=response.content.decode('utf-8') return html #解析网页 def page_parse(html): soup=BeautifulSoup(html,'html.parser') sentence=soup.select(("#content > div > div.article > ol > li")) for i in range(len(sentence)): temp=sentence[i] #获取影片名称 name=temp.select(".hd > a > span")[0].get_text() #获取影片排名 top=temp.select(".pic > em")[0].get_text() #获取影片评分 score=temp.select(".bd > div > span.rating_num")[0].get_text() #获取影片链接 link=temp.select(".hd > a")[0].get('href') #对获取内容进行打印 print(top+"-"+name+"-"+score+"-"+link) if __name__=='__main__': print("开始爬取") ua={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"} for i in range(1,11): url = f'https://movie.douban.com/top250?start={(i - 1) * 25}' time.sleep(1) html=page_request(url,ua) page_parse(html)
这就是一个简单的爬虫程序,再深一步就是对每一个影片链接的子网页进行请求访问了,其实原理很相似,就是对这里获取的link链接,进行了第二次解析,不过,这个子网里的标签比较复杂,就不再适合使用CSS选择器来获取标签了,find()和find_all()则更适合这种任务。
如果有空闲时间的话,会把对子网解析的操作过程放上来的,更鼓励大家去尝试一下,这个解决问题的过程,会让你更熟悉这个流程。完结版(经典网络爬虫实践内容---豆瓣网页内容爬取(完结)-CSDN博客)
进阶版(进阶网络爬虫实践内容---微博网页内容爬取-CSDN博客)
(如果觉得内容还看得过去,记得给个五星好评,先谢过了)