从零起步系统入门Python爬虫工程师(二)-慕课实战 csdn论坛(静态网页) 京东项目(动态网页) scrapy(pyspider) 底层异步IO库

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

注意项:

  1. F12查看‘元素’找到元素用Selector 的xpath解析出来(解析出来的继续调用xpath 注意 需要加上当前路径 ”.//div“)

  2. 自动加上域名 parse.urljson(domain,url)

  3. 当ORM有id属性的时候就默认当做Primarykey(如果没有回自动生成一个id),当对数据进行更新操作的时候不能直接调用save方法,调用topic.save(force_insert=True)#有id默认是更新 此时又没有这条数据就会导致更新失败

  4. author_url.split("/")[-1] -1表示的是最后一个

  5. 字符串转时间格式datetime.strptime(time_str,”%Y-%m-%d %H:%M:%S")

  6. 解析的时候有时候会碰到返回403之类的不正常错误 是反爬的问题,需要做相应处理

  7. 把字符串转为list ast.literal_eval(node_str)

京东项目(动态网页)

  1. 了解哪些数据时动态加载

    1. 数据加载更慢

    2. 删除js代码,然后本地显示html,看哪些数据没有显示就是动态加载的

  2. 如何获取数据

    1. 分析

      1. 在控制台的XHR(异步请求)看下有没有请求

      2. 查询js文件,js文件返回的是否有页面的字段

      3. 分析(看js源文件)构造参数,js请求

    2. selenium自动化

      1. pip install selenium
      2. 查看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)

  1. 获取session/cookies
    1. request.session()
    2. 登录返回res.cookies.get_direct()
    3. 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 松开鼠标
用一个函数模拟人的拖动

验证码识别 服务商

  1. 云打码 ——> 比较准
  2. 超级鹰——>识别类型多

反爬&反反爬

  • user-agent ————> install fake-useragent 随机
  • ip访问频率限制 ————>ip代理 免费(不稳定) 阿布云
  • 必须登录
  • 动态网页
  • 前端js逻辑加密和混淆
  • 机器学习分析爬虫行为
  • 只请求html,不请求css和js
  • css代码下毒(界面隐藏)
ps:Refer 从哪个网站跳转过来

scrapy(pyspider) 底层异步IO库

  • 创建scrapy项目
  • item pipline
  • MiddleWares中间件 download Spider
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章