网络爬虫

网络爬虫(web crawler),以前经常称之为网络蜘蛛,是按照一定的规则自动浏览万维网并获取信息的机器人程序(或脚本),曾经被广泛的应用于互联网搜索引擎。使用过互联网和浏览器的人都知道,网页中除了供用户阅读的文字信息之外,还包含一些超链接。网络爬虫系统正是通过网页中的超链接信息不断获得网络上的其它页面。正因如此,网络数据采集的过程就像一个爬虫或者蜘蛛在网络上漫游,所以才被形象的称为网络爬虫或者网络蜘蛛。

合法性和背景调研

  1. 网络爬虫领域目前还属于拓荒阶段,虽然互联网世界已经通过自己的游戏规则建立起一定的道德规范(Robots协议,全称是“网络爬虫排除标准”),但法律部分还在建立和完善中,也就是说,现在这个领域暂时还是灰色地带。
  2. “法不禁止即为许可”,如果爬虫就像浏览器一样获取的是前端显示的数据(网页上的公开信息)而不是网站后台的私密敏感信息,就不太担心法律法规的约束,因为目前大数据产业链的发展速度远远超过了法律的完善程度。
  3. 在爬取网站的时候,需要限制自己的爬虫遵守Robots协议,同时控制网络爬虫程序的抓取数据的速度;在使用数据的时候,必须要尊重网站的知识产权(从Web
    2.0时代开始,虽然Web上的数据很多都是由用户提供的,但是网站平台是投入了运营成本的,当用户在注册和发布内容时,平台通常就已经获得了对数据的所有权、使用权和分发权)。如果违反了这些规定,在打官司的时候败诉几率相当高。

所需工具

还有一些常用的第三方库

pip install bs4 # 包含BeautifulSoup
pip install lxml
pip install pymysql # 连接数据库的包

我们常用的是BeautifulSoup, 相关文档BeautifulSoup文档

当然,爬虫的辅助开发工具还有很多,比如Postman等,这里只用到了这三个,相信有了这些能减少不少开发阻碍。

最简单的爬虫试例

最简单的爬虫莫过于单线程的静态页面了,我们先尝试获取百度的title

#import urllib.request
from urllib import request
import re

#请求URL
url=r"http://www.baidu.com/"

#构造请求头信息
header={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"
    # "User-Agent": "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"
}
#创建自定义请求对象
#req=request.Request(url,headers=header)

#发送请求 获取响应信息
#reponse=request.urlopen(req).read().decode() #decode 解码

#pat=r"<title>(.*?)</title>" #通过正则表达式获取需要信息
#data=re.findall(pat,reponse)

#print(data[0])

#构建HTTP处理器对象(专门处理HTTP请求的对象)
http_handler=request.HTTPHandler()

#创建自定义opener
opener=request.build_opener(http_handler)

#创建自定义请求对象
req=request.Request(url,headers=header)

#把自定义opener设置为全局,这样用urlopen发送的请求也会使用自定义的opener
request.install_opener(opener)

reponse=request.urlopen(req).read().decode() #decode 解码

pat=r"<title>(.*?)</title>" #通过正则表达式获取需要信息
data=re.findall(pat,reponse)

print(data[0])

输出结果:
请输入图片描述

乍一看,就这么个玩意儿,还不如直接自己去网页看,这有什么用呢?但是,你想想,只要你掌握了这种方法。如果需要获取网页上的具体事项 是不是就可以通过代码来实现了。比方大家常用的豆瓣排行。

获取豆瓣top250实例

请输入图片描述
请输入图片描述
我们先分析一下,本次是需要获取豆瓣排行的top250个,网址是 https://movie.douban.com/top250
进入页面我们先F12检查一下网页元素,见到花花绿绿的HTML代码不要害怕,一个一个点,直到找到需要的信息就行了,可以看到所有电影名都是在这样

<div class = "info">

之下的,每有一个这样的标签就代表一个电影,从他的孩子< span >中即可抓取到电影名,还有标注的其他信息。
理解之后,直接上代码:

#引入第三方包
import requests
from bs4 import BeautifulSoup
import openpyxl

def gethtmltext(url):
    try:
        header={
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'
        }#假如头信息不是游览器会被阻止访问
        r=requests.get(url, headers = header);
        r.raise_for_status();#如果状态码不是200就会报错
        r.encoding=r.apparent_encoding;
        return r.text;#截取前1000个字符[:1000]
    except:
        return "异常"
def select(url):
    arr=[]
    demo=gethtmltext(url)
    soup=BeautifulSoup(demo,"html.parser")
    all_soup=soup.find_all("div",class_="info")
    for each in all_soup:
        mov = each.span.text
        #遍历输出电影名
        print(mov)
        href = each.a['href']
        act = each.p.text
        fraction = each.find("span", class_="rating_num").text
        try:
            pinglun=each.find("span",class_="inq").text
        except:
            pinglun=''
        arr.append([mov, href, act, fraction, pinglun])
    return arr

def save(arr):
    wb=openpyxl.Workbook()
    ws=wb.active
    ws['A1']="电影名称"
    ws['B1']="链接"
    ws['C1']="演员"
    ws['D1']="评分"
    ws['E1']="评论"
    for each in arr:
        ws.append(each)
    wb.save("豆瓣排名.xlsx")
if __name__ == "__main__":
    result=[]
    for i in range(0,250,25):
        url = "https://movie.douban.com/top250?start={}&filter=".format(i)
        arr=select(url)
        result.extend(arr)
    save(result)

这里加了一个写入Excel的功能,需要引入 openpyxl ,没有的可以下载 pip install openpyxl
是不是很神奇~

最后修改:2022 年 10 月 18 日 11 : 09 AM
如果觉得我的文章对你有用,请随意赞赏