爬虫有可能违法、严重的构成犯罪

  1. 爬虫程序规避网站经营者设置的反爬虫措施或者破解服务器防抓取措施,非法获取相关信息,情节严重的,有可能构成“非法获取计算机信息系统数据罪”。
  2. 爬虫程序干扰被访问的网站或系统正常运营,后果严重的,触犯刑法,构成“破坏计算机信息系统罪”
  3. 爬虫采集的信息属于公民个人信息的,有可能构成非法获取公民个人信息的违法行为,情节严重的,有可能构成“侵犯公民个人信息罪”。
  4. 使用了反爬技术或者数据加密技术的,尽量不要尝试破解获取。

    案例:警方披露巧达科技案情:36人被批捕,非法获取简历超2亿条

Python爬虫常用库

  1. requests:非常轻松地发送 HTTP/1.1 请求
  2. urllib
  3. re:正则表达式匹配操作
  4. lxml:一个高效的 XML 和 HTML 解析器
  5. xpath:内容解析
  6. beautifulsoup:从HTML或XML文件中提取数据的Python库
  7. Selenium:浏览器自动化
  8. Scrapy:很强大的爬虫框架,可以满足简单的页面爬取
  9. Parsel:它使用XPathCSS选择器从HTMLXML 中提取和删除数据,可选择与正则表达式结合使用 。

请求头

  • Accept:请求报头域,用于指定客户端可接受哪些类型的信息。
  • Accept-Language:指定客户端可接受的语言类型。
  • Accept-Encoding:指定客户端可接受的内容编码。
  • Host:用于指定请求资源的主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的位置。从 HTTP 1.1 版本开始,请求必须包含此内容。
  • Cookie:也常用复数形式 Cookies,这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据。它的主要功能是维持当前访问会话。例如,我们输入用户名和密码成功登录某个网站后,服务器会用会话保存登录状态信息,后面我们每次刷新或请求该站点的其他页面时,会发现都是登录状态,这就是 Cookies 的功劳。Cookies 里有信息标识了我们所对应的服务器的会话,每次浏览器在请求该站点的页面时,都会在请求头中加上 Cookies 并将其发送给服务器,服务器通过 Cookies 识别出是我们自己,并且查出当前状态是登录状态,所以返回结果就是登录之后才能看到的网页内容。
  • Referer:此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计、防盗链处理等。
  • User-Agent:简称 UA,它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本、浏览器及版本等信息。在做爬虫时加上此信息,可以伪装为浏览器;如果不加,很可能会被识别出为爬虫。
  • Content-Type:也叫互联网媒体类型(Internet Media Type)或者 MIME 类型,在 HTTP 协议消息头中,它用来表示具体请求中的媒体类型信息。例如,text/html 代表 HTML 格式,image/gif 代表 GIF 图片,application/json 代表 JSON 类型

代码示例

爬虫的数据来源可以分为接口和服务器渲染的HTML

百度翻译

  1. import requests
  2. url = "https://fanyi.baidu.com/sug"
  3. input = input("请输入要翻译的内容:")
  4. data = {
  5. "kw": input
  6. }
  7. response = requests.post(url, data=data)
  8. res_t = response.json()
  9. print(res_t)
  10. print(res_t["data"][0]["v"])
  11. response.close()

豆瓣电影分类

import requests

url = "https://movie.douban.com/j/chart/top_list"
# 重新封装参数
param = {
    "type": "11",
    "interval_id": "100:90",
    "action": "",
    "start": 0,
    "limit": 20
}
headers = {
    "User-Agent": "user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"
}
response = requests.get(url=url, params=param, headers=headers)
# 请示头
# print(response.request.headers)
print(response.json())
response.close()

豆瓣电影新片排行榜

服务器端渲染,使用python自带re模块正则表达式解析html

# -*- conding: utf-8 -*-
# @Author:暗香彻骨.沐之杰 (Addis)
# @Contact : qyx01@qq.com 
# @Time: 2021/7/3 20:03
# @Software: PyCharm
# @File: 豆瓣电影新片排行榜.py
# @Description:
import re
import pandas as pd
import requests
import openpyxl

headers = {
    "User-Agent": "user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"
}
url = "https://movie.douban.com/chart"
resp = requests.get(url, headers=headers)
page_content = resp.text
# print(page_content)
# 解析数据
obj = re.compile(
    r'<tr class="item">.*? <a class="nbg" href="(?P<url>.*?)"  title="(?P<name>.*?)".*? <p class="pl">(?P<date>.*?)\((.*?)\).*?<span class="rating_nums">(.*?)</span>.*?<span class="pl">\((\d+).*?</span>',
    re.S)
res = obj.finditer(page_content)
dataset = []
for i in res:
    dict = {"title": i.group("name"), "url": i.group("url"), "desc": i.group("date"), "country": i.group(4),
           "rating_nums": i.group(5), "evaluate": i.group(6)}
    dataset.append(dict)


df = pd.DataFrame(dataset)
print(df.head())
# 输出到Excel格式文件
df.to_excel(r'../../data_static/电影.xlsx', sheet_name='豆瓣电影',index=False)