经典网络爬虫实践内容---豆瓣网页内容爬取(初级)

        实践内容为:访问豆瓣电影Top250(豆瓣电影 Top 250),获取每部电影的中文片名、排名、评分及其对应的链接,按照“排名-中文片名-评分-链接”的格式显示在屏幕上。(根据需要可以自己添加)

        在这里我们选用CSS选择器来获取标签,首先演示如何通过本地操作获取标签。

  1. 打开豆瓣电影Top250网页豆瓣电影 Top 250
  2. 在网页上右击我们所要获取的信息;

例如:要获取《肖申克的救赎》电影的导演,将鼠标移至该电影的导演处,右击鼠标出现。

        3.点击检查,即可定位该信息在html网页源码的具体位置;

 

        4.右击对应标签,选择Copy -> Copy selector,即可获得对应元素的CSS选择器 

        5.将复制得到的CSS选择器粘贴在soup.select()中即可。

完成标签获取的学习后,将开始实际操作(以下均默认你已经安装并配置好了Pycharm)

  1. 在PyCharm中新建工程包,命名为webCrawler;
  2. 在webCrawler工程下新建doubanCrawler文件夹;
  3. 在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博客

(如果觉得内容还看得过去,记得给个五星好评,先谢过了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值