csdn论坛(静态网页)
数据库连接
安装依赖库 pymysql
相关操作代码github(https://github.com/PyMySQL/PyMySQL)
connection = pymysql.connect(host='localhost',
user='root',
password='1234567a',
db='spider',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
项目使用的是peewee,ORM操作(还有djangORM sqlalchemy )github(https://github.com/coleifer/peewee)
优势:1.隔离数据库和版本 2.便于维护 3.SQL注入
db = MySQLDatabase("spider",host="127.0.0.1",port=3306,user="root",password="1234567a”)
class BaseModel(Model):
class Meta:
database = db
# 设置表需要注意的一些事项
"""
char类型 要设置最大长度 默认是255
对于无法确认的最大长度设置为Text
设计表的时候,采集到的数据要尽量做格式化处理
default和null=True
"""
class Topic(BaseModel):
title = CharField()
content = TextField(default="")
id = IntegerField(primary_key=True)
author = CharField()
create_time = DateTimeField()
answer_nums = IntegerField(default=0)
click_nums = IntegerField(default=0)
praised_nums = IntegerField(default=0)
jtl = FloatField(default=0.0) # 结帖率
score = IntegerField(default=0) #赏分
status = CharField() # 转态
last_answer_time = DateTimeField()
注意项:
-
F12查看‘元素’找到元素用Selector 的xpath解析出来(解析出来的继续调用xpath 注意 需要加上当前路径 ”.//div“)
-
自动加上域名 parse.urljson(domain,url)
-
当ORM有id属性的时候就默认当做Primarykey(如果没有回自动生成一个id),当对数据进行更新操作的时候不能直接调用save方法,调用topic.save(force_insert=True)#有id默认是更新 此时又没有这条数据就会导致更新失败
-
author_url.split("/")[-1] -1表示的是最后一个
-
字符串转时间格式datetime.strptime(time_str,”%Y-%m-%d %H:%M:%S")
-
解析的时候有时候会碰到返回403之类的不正常错误 是反爬的问题,需要做相应处理
-
把字符串转为list ast.literal_eval(node_str)
京东项目(动态网页)
-
了解哪些数据时动态加载
-
数据加载更慢
-
删除js代码,然后本地显示html,看哪些数据没有显示就是动态加载的
-
-
如何获取数据
-
分析
-
在控制台的XHR(异步请求)看下有没有请求
-
查询js文件,js文件返回的是否有页面的字段
-
分析(看js源文件)构造参数,js请求
-
-
selenium自动化
- pip install selenium
- 查看chrome浏览器版本(也可以是FireFox Android等等)下载对应的webDriver(http://npm.taobao.org/ 去下载)
-
from selenium import webdriver
brower = webdriver.Chrome(executable_path=‘/Application/PyCharm….’)
sl = Selector(text=brower.page_source)
登录(request)
- 获取session/cookies
- request.session()
- 登录返回res.cookies.get_direct()
- cookies写入本地
f = open(‘douban.cookie’,’wb’)
Pickle.dump(res.cookies,f)
f.close()
with open(‘douban.cookie’,’wb’) as f 就不需要调用close方法
登录(selenuim)
ps:1. 里面有iframe,selenium获取不到 ,通过 brower.switch_to.frame(xpath)
2.brower.getCookie获取,里面信息比较多,需要过滤key value
滑动验证码
(1)鼠标移动位置上
(2)保存按住之前的图
(3)按住显示缺口图 保存
(4)对比,计算出滑动距离
(5)滑动滑块
(1)
from selenium.webdrive import Actionchains
ActionChains(brower).move_to_element(slider).perform()
(2)
xpath定位元素 img 的location 和size确定好位置
top,bottom,left,right = location[‘Y’],location[‘Y’]+size[‘height’],location[‘X’],location[‘X’]+size[‘width’]
brower.maximize_window()窗口最大化
brower.get_screen_as_png()获取全屏图片
install pillow
from PIL import Image
from IO import ByteIO()
screenshot = Image.open(BytesIO(screenshot))
crapcha = screenshot.crop(int(left),int(top),int(right),int(bottom))
(3) click_and_hold
(4)
对比像素 rgp不一样(设置一个域值 60)
image.load()[i,j]
(5)
move_by_offset() 拖动
release 松开鼠标
用一个函数模拟人的拖动
验证码识别 服务商
- 云打码 ——> 比较准
- 超级鹰——>识别类型多
反爬&反反爬
- user-agent ————> install fake-useragent 随机
- ip访问频率限制 ————>ip代理 免费(不稳定) 阿布云
- 必须登录
- 动态网页
- 前端js逻辑加密和混淆
- 机器学习分析爬虫行为
- 只请求html,不请求css和js
- css代码下毒(界面隐藏)
ps:Refer 从哪个网站跳转过来
scrapy(pyspider) 底层异步IO库
- 创建scrapy项目
- item pipline
- MiddleWares中间件 download Spider
网友评论