想学Python爬虫吗? 我教你啊

140 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

什么是爬虫?

  • 爬虫就是模拟客户端(浏览器)发送网络请求,获取响应,按照规则提取数据的程序
  • 模拟客户端(浏览器)发送网络请求 : 照着浏览器发送一模一样的请求,获取和浏览器一模一样的数据

HTTP、HTTPS

  • HTTP:超文本传输协议

    • 以明文的形式传输
    • 效率更高,但是不安全
  • HTTPS:HTTP + SSL(安全套接字层)

    • 传输之前数据先加密,之后解密获取内容
    • 效率较低,但是安全
  • get请求和post请求的区别

    • get请求没有请求体,post有,get请求把数据放到url地址中
    • post请求常用于登录注册,
    • post请求携带的数据量比get请求大,多,常用于传输大文本的时候
  • HTTP协议之请求

    • 1.请求行

    • 2.请求头

      • User-Agent:用户代理:对方服务器能够通过user_agent知道当前请求对方资源的是什么浏览器

        • 如果我们需要模拟手机版的浏览器发送请求,对应的,就需要把user_agent改成手机版
      • Cookie:用来存储用户信息的,每次请求会被携带上发送给对方的浏览器

        • 要获取登录后才能访问的页面
        • 对方的服务器会通过cookie来判断是我们是一个爬虫
    • 3.请求体

      • 携带数据
      • get请求没有请求体
      • post请求有请求体
  • HTTP协议之响应

    • 1.响应头

      • Set-Cookie:对方该字段设置cookie到本地
    • 2.响应体

      • url地址对应的响应

request模块

  • response = requests.get(url) #发送get请求,请求url地址对应的响应
  • response = reqeusts.post(url,data={请求体的字典}) ##发送post请求

response

  • response.text

    • 该方式往往会出现乱码,出现乱码使用response.encoding="utf-8"
  • response.content.decode()

    • 把响应的二进制字节流转化为str类型
  • resposne.request.url 发送请求的url地址

  • response.url 响应的url地址

  • resposne.request.headers 请求头

  • resposne.headers 响应请求

xpath

  • xpath

    • 一门从html中提取数据的语言
  • xpath语法

    • xpath helper插件:帮助我们从elements中定位数据

      1. 选择节点(标签)

      • /html/head/meta :能够选中html下的head下的所有的meta标签
      1. // :能够从任意节点开始选择

      • //li :当前页面上的所有的li标签
      • /html/head//link :head下的所有的link标签
      1. @符号的用途

      • 选择具体某个元素://div[@class='feed']/ul/li

        • 选择class='feed'的div下的ul下的li
      • a/@href :选择a的href的值

      1. 获取文本:

      • /a/text() :获取a下的文本
      • /a//text() :获取a下的所有的文本

示例

这里以爬取猫眼电影网站的电影信息为例。

import requests
from lxml import etree
import json

# 获取请求的url,需要读取多页的数据
def get_url(url_temp):
    # 切换页码,下一页操作
    url_list = [url_temp.format(i*10)for i in range(6)]
    return url_list
# 获取请求的响应体    
def get_response(url,headers):
    response = requests.get(url,headers=headers)
    return response.text
# 解析响应体中需要的内容。
def get_content(html_str):

    html = etree.HTML(html_str)

    url_list = html.xpath("//dl[@class='board-wrapper']/dd")

    content_list = []
    for url in url_list:
        dict = {}
        dict["电影名字"] = url.xpath("./a/@title")[0]
        dict["主演"] = url.xpath(".//div[@class='movie-item-info']//p[@class='star']/text()")[0].strip()
        dict["评分"] = url.xpath(".//p[@class='score']/i[@class='integer']/text()")[0] + \
                        url.xpath(".//p[@class='score']/i[@class='fraction']/text()")[0]
        dict["图片链接"] = url.xpath("./a/child::*/@src")
        dict["电影链接"] = 'https://maoyan.com' + url.xpath("./a/@href")[0]

        content_list.append(dict)
        print(dict)
    return content_list
# 保存我们需要的内容到本地。
def save_content(content_list):
    with open("cat_eye.txt","a+",encoding="utf-8")as f:
        f.write(json.dumps(content_list,ensure_ascii=False))

def run():
    # 要爬的网址
    url_temp = "https://maoyan.com/board/4?offset={}"
    # 请求头带上浏览器标识
    headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}
    url_list = get_url(url_temp)
    # 循环遍历url,即一页一页的爬
    for url in url_list:
        html_str = get_response(url,headers)
        content_list = get_content(html_str)
        save_content(content_list)


if __name__ == '__main__':
    run()

总结

  1. 发送请求。
  2. 获取响应体。
  3. 解析响应体,获取我们需要的信息。
  4. 将爬取的数据进行保存。