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()