爬+存入数据库(pymysql+requests+XPath)python3

1. 知识点

python基础知识(面向对象)

request模块

html基本知识+XPath定位

MySQL 和 pymsql模块

2. 准备工作

1. 先去目标网站找到网址分辨其为同步加载网页还是异步加载网页

简单的区分方法:

在网页更新/翻页的同时观察左上角刷新按钮是否变动

变动 -- 同步

不动 -- 异步

同步 -->去往network - 全部里搜索

异步 --> 去往network - XHR里搜索

利用XPath语法定位爬取的目标内容

将XPath复制保存下来

例如:

XPath = '//ul[@class = "list2"]/li/h3/a'

2. 搭建面向对象的框架,明确各部分功能,以及预期设想

预期设想:爬取某网页的标题,以及点击标题链接之后的内容

搭载框架

# 首先是导包
import re 
from pymysql import connect 
import requests 
from lxml import etree 

class Spider(object):
    def __init__(self):
        self.url = '...'
        self.'伪装' = '...'
        # 创建连接对象
        self.con = connect{....}
        # 创建游标
        self.cs = self.con.cursor()
    
    # 根据url获取数据信息
    def get_data(self, url):
        pass

    # 根据获取信息解析目标数据
    def parse_data(self):
        pass

    # 对目标信息二次解析,以获取连接内的信息
    def parse_two_data(self):
        pass

    # 保存数据至mysql
    def save_data():
        pass

    # 运行
    def run():
        pass


if __name__ == '__main__':
    s = Spider()
    s.run()

3. 

1 - Get_data()

首先呢去找到目标的url

为自己套上伪装headers

必要的时候需要代理

获取到的数据存为 html_data = response.text

2 - Parse_data()

利用etree.HTML()方法将其转为XML

再用XPath方法去定位到目标信息

titles = xml.xpath('//ul[@class = "list2"]/li/h3/a/text()')
title_links = xml.xpath('//ul[@class = "list2"]/li/h3/a/@href')

titles = 每个标题

title_links = 每条链接

3 - Parse_two_data()

这里我们需要根据Parse_data所获得的链接的url复用get_data()的方法

所以只需要再原来的基础上加调用再将3的数据return到2中即可

4 - save_data()

首先我们可以去navicate去建立一个有id、title、title_link、content的表

然后用sql语句:

insert into XPath_book(title, title_link, content) values (%s, %s, %s)

将我们的数据存放进数据库中execute

最后再提交数据commit

这里需要用到sql语句:

5 - run()

根据逻辑将代码先后运行顺序列好,最后主函数去调用执行

Demo

代码仅提供大致思路及方法,代码中省略其网址信息.....

import re
from pymysql import connect
import requests
from lxml import etree

"""
准备工作:先利用XPath去网站看目标内容的定位
XPath = '//ul[@class = "list2"]/li/h3/a'


"""


class Spider(object):
    def __init__(self):
        # url
        self.url = '...'
        # 伪装
        self.headers = {
            'User-Agent': '...'
        }
        # 创建连接对象
        self.conn = connect(
            user='root',
            password='...',
            host='...',
            port=...,
            database='spider',
            charset='utf8mb4',
        )
        # 创建游标对象
        self.cs = self.conn.cursor()

    def get_data(self, url):
        res = requests.get(url, headers=self.headers)
        html_data = res.text
        xml = etree.HTML(html_data)
        # print(html_data) # 验证数据 html_data
        return xml

    def parse_data(self, xml):
        titles = xml.xpath('//ul[@class = "list2"]/li/h3/a/text()')
        title_links = xml.xpath('//ul[@class = "list2"]/li/h3/a/@href')
        # print(len(titles),len(title_links)) # 验证数目
        for title, title_link in zip(titles, title_links):
            # print(title)
            # print(title_link)
            con = self.parse_two_data(title_link)
            self.save_data(title, title_link, con)

    # 解析详情页
    def parse_two_data(self, links):
        # xpath = '//div[@class = "con"]/div/p'
        content_xml = self.get_data(links)
        contents = content_xml.xpath('//div[@class = "con"]/div//text()')[2:-3]
        # print(contents)
        con = "".join(contents)
        con = re.sub("..qh/", "", con)
        return con

    def save_data(self, title, title_link, con):
        sql = "insert into XPath_book(title, title_link, content) values (%s, %s, %s)"
        self.cs.execute(sql, [title, title_link, con])
        self.conn.commit()

    def run(self):
        for page in range(1,6):
            url = 'ht....html'.format(page)
            print(f'正在爬取第{page}页')
            html_data = self.get_data(self.url)
            self.parse_data(html_data)
        self.cs.close()
        self.conn.close()


if __name__ == '__main__':
    s = Spider()
    s.run()

功能实现:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值