爬虫基础看这里

  1. 数据抓取。直白点说就是从网上“偷”东西。哈哈。如果用requests.get直接抓 话,一般网站会有反扒机制,不信你试试
    import requests
    res = requests.get('https://www.baidu.com/s?wd=狗')

    * 上面截图是结果,所以得升级一下请求机制。据分析,服务器会识别你爬虫过来的,还是浏览器发过来的请求,有个头信息User-Agent,只要我们伪造一下这个头信息就可以实现抓取网站新了。开搞。

    import requests
    hander = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
    }
    res = requests.get('https://www.baidu.com/s?wd=狗', headers=hander)
    # 保持抓到的数据编码和文件数据编码一直,这点特别需要注意
    res.encoding = 'utf-8'
    with open('shi.html', 'w+', encoding='utf-8') as fp:
        fp.write(res.text)
  2. 数据解析。上面部分结束相信你就可以拿到爬虫数据了,接下来是解析数据部分。只要用到bs4,lxml模块,自行pip安装一下即可。
    方法一:bs4

    import requests
    from bs4 import BeautifulSoup
    import lxml
    hander = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
    }
    res = requests.get('https://so.gushiwen.cn/mingju/juv_2f9c31fa9530.aspx', headers=hander)
    res.encoding = 'utf-8'
    with open('shi.html', 'w+', encoding='utf-8') as fp:
        fp.write(res.text)
    fp = open('shi.html', 'r', encoding='utf-8') 
    soup = BeautifulSoup(fp, 'lxml')
    # 标签名称定位
    print(soup.a)
    # 选择器定位
    print(soup.select('.right > div > a'))

    代码里只是列了一部分获取抓取页面里内容的方法,比如标签定位和选择器定位。如果想要获取更多方法可以百度自行搜一下,这里不赘述了。
    方法二:xpath

    import requests
    import lxml
    from lxml import etree
    hander = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
    }
    res = requests.get('https://so.gushiwen.cn/mingju/juv_2f9c31fa9530.aspx', headers=hander)
    tree = etree.HTML(res.text)
    # 返回对象
    tree.xpath('/html/head/meta')
  3. 代理:
    为什么要用代理:如果一个ip多次请求服务器,服务器会任务该IP在恶意攻击,会禁用该IP
    免费代理:快代理、代理精灵、西祠代理等.免费代理有很多用不了的,本人用的是快代理。注册给免费用的代理服务器,很好用。

    import requests
    hander = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
    }
    proxies = {
        'https' : "58.17.103.155:23119"
    }
    res = requests.get('http://so.gushiwen.cn/mingju/juv_2f9c31fa9530.aspx', headers=hander, proxies=proxies)

  4. 模拟登陆:有些网站需要登录后才能访问完整接口。
    a.验证码的处理
           --- 云打码
           --- 超级鹰
    b.下面我给大家展示下模拟登录古文网的流程代码,读者着重看main方法就可以,里面那个大类是三方平台超级鹰提供的,用来做验证码识别,大家也可以注册一下,绑定微信好可以获得免费测试机会。

    #!/usr/bin/env python
    # coding:utf-8
    
    import json
    from turtle import radians
    import requests
    import lxml
    from lxml import etree
    from hashlib import md5
    from bs4 import BeautifulSoup
    import lxml
    class Chaojiying_Client(object):
        def __init__(self, username, password, soft_id):
            self.username = username
            password =  password.encode('utf8')
            self.password = md5(password).hexdigest()
            self.soft_id = soft_id
            self.base_params = {
                'user': self.username,
                'pass2': self.password,
                'softid': self.soft_id,
            }
            self.headers = {
                'Connection': 'Keep-Alive',
                'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
            }
    
        def PostPic(self, im, codetype):
            """
            im: 图片字节
            codetype: 题目类型 参考 http://www.chaojiying.com/price.html
            """
            params = {
                'codetype': codetype,
            }
            params.update(self.base_params)
            files = {'userfile': ('ccc.jpg', im)}
            r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
            return r.json()
    
        def ReportError(self, im_id):
            """
            im_id:报错题目的图片ID
            """
            params = {
                'id': im_id,
            }
            params.update(self.base_params)
            r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
            return r.json()
    
    
    if __name__ == '__main__':
        url_login = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
        url1 = 'https://so.gushiwen.cn/shiwens/default.aspx?page=1&tstr=&astr=&cstr=&xstr='
        path = 'y.jpeg'
        psMP = {
            '__VIEWSTATE': 'f6m+61PLoT0NCmMX5NgLB1GmWgh98KiPWF15HDieb89obebDL8pRWUzrkFqolpU4wBMNCBuQyO1BNgYN4x8kVZupTTzlpzu6mVzVPp+N74bEMNR7hFq0/s3U0Ws=',
            '__VIEWSTATEGENERATOR': 'C93BE1AE',
            'from': 'http://so.gushiwen.cn/user/collect.aspx',
            'email': '2417876887@qq.com',
            'pwd': 'ppqq19930922',
            'code': 'c50w',
            'denglu': '登录'
        }
        se = requests.Session()
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
        }
        # 缓存cookie 抓取需要登录验证的参数信息
        r = se.post(url_login, data=psMP, headers=headers)
        handle = open('jj.html', 'w+', encoding='utf-8')
        handle.write(r.text)
        fp = open('jj.html', 'r', encoding='utf-8') 
        soup = BeautifulSoup(fp, 'lxml')
    
        # 选择器定位 请求中动态参数抓取
        __VIEWSTATE = soup.select('#__VIEWSTATE')[0]['value']
        __VIEWSTATEGENERATOR = soup.select('#__VIEWSTATEGENERATOR')[0]['value']
        img = 'https://so.gushiwen.cn' + soup.select('#imgCode')[0]['src']
        res = se.get(img, headers=headers)
        path = 'yzm.jpg'
        handle_img = open(path, 'wb')
        handle_img.write(res.content)
        handle_img.close()
    
        # 此处验证码识别用的是超级鹰平台提供的服务,识别率比较高,Chaojiying_Client就是上面哪个大类,是超级鹰平台提供的,我为了给大家方便测试
        # 直接放到这里了,没有做封装
        # 之前听网友说用 Tesseract-OCR+pytesseract 识别,但是本人试了一下,确实识别率不高,
        # 但是这个插件提供了训练功能,大家感兴趣的可以训练一下
        # 给大家个参考地址 https://www.jianshu.com/p/3326c7216696
        chaojiying = Chaojiying_Client('超级鹰账号', '超级鹰密码', '96001')	
        img = open(path, 'rb').read()	
        json_res = chaojiying.PostPic(img, 1902)											
        print(json_res)	
        psMP = {
            '__VIEWSTATE': __VIEWSTATE,
            '__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,
            'from': 'http://so.gushiwen.cn/user/collect.aspx',
            'email': '2417876887@qq.com',
            'pwd': 'ppqq19930922',
            'code': json_res['pic_str'] ,
            'denglu': '登录'
        }
        print(psMP)
        r = se.post(url_login, data=psMP, headers=headers)
        handle = open('jj.html', 'w+', encoding='utf-8')
        handle.write(r.text)

    上面这段代码是模拟登录,主要有几点需要说下:
    1) 缓存cookie。你登录网址或者请求接口的时候必须得携带本网站的cookie,要不请求会被拒绝,这个时候就得用session来发请求,发完请求session模块会缓存下来平台提供的cookie,但是你有时候发请求不确定那个链接能缓存cookie,所以建议你所有的请求都用session发。
    2) 验证码识别。此处验证码识别用的是超级鹰平台提供的服务,识别率比较高,之前听网友说用 Tesseract-OCR+pytesseract 识别,但是本人试了一下,确实识别率不高,但是这个插件提供了训练功能,大家感兴趣的可以训练一下,给大家个参考地址: https://www.jianshu.com/p/3326c7216696
    3) 动态参数。开发者注意观察传参是否有动态参数,就是一直在变化的参数,如果有想办法获取即可。

  5. selenium :浏览器自动化模块。通过代码来设置一些基于浏览器的动作。说白了就是用代码指挥浏览器干活。
    首先下载浏览器驱动,我这里举例谷歌浏览器了。主要下载驱动的版本和自己浏览器要做版本对应。
    pip install selenium
    谷歌浏览器驱动下载 https://registry.npmmirror.com/binary.html?path=chromedriver/
    作用:a 模拟登陆
               b 获取页面加载数据


     下面代码是一些基础练习:打开京东网址->搜索"华为手机"->滑动滚轮->获取页面数据->关闭浏览器。
    如想了解详细,可以百度哦。

    from time import sleep
    from selenium import webdriver
    oj = webdriver.Chrome(executable_path='chromedriver.exe')
    
    # 发送请求
    url = 'https://www.jd.com'
    oj.get(url)
    
    # 标签定位
    search = oj.find_element_by_xpath('//*[@id="key"]')
    search.send_keys('华为手机')
    search_button = oj.find_element_by_xpath('//*[@id="search"]/div/div[2]/button')
    search_button.click()
    sleep(2)
    
    # js注入
    oj.execute_script('window.scrollTo(0,1000)')
    sleep(2)
    
    # 捕获当前页面数据
    content = oj.page_source
    print(content)
    sleep(2)
    # 退出浏览器
    oj.quit()
    

                 c 动作链模拟:滑动某个标签

    
    from argparse import Action
    from time import sleep
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    """
        功能:动作链
    """
    obj = webdriver.Chrome(executable_path='chromedriver.exe')
    url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
    
    obj.get(url)
    # 如果页面中有iframe标签,需要切换, 参数是iframe标签id
    obj.switch_to.frame('iframeResult')
    div_tag = obj.find_element_by_xpath('//*[@id="draggable"]')
    
    # 实例化动作链对象
    action = ActionChains(obj)
    # 点击且长按
    action.click_and_hold(div_tag)
    # perform 让动作立即执行
    for i in range(5):
        action.move_by_offset(xoffset=15, yoffset=15).perform()
        sleep(1)
    obj.quit()
  6. js处理
    逆向:抓取到的数据,翻译成python.
               PyExceJS模拟执行js
    加密解密:js被加密了,
                解密网址:便民吧

  7.  页面反扒规避
        
       如果是selenium 打开的浏览器执行下面的代码会返回true

    window.navigator.webdriver

     网上说,执行下面的代码会反扒。

    from selenium.webdriver import ChromeOptions
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    url = 'https://www.taobao.com/'
    obj = webdriver.Chrome(executable_path='chromedriver.exe', options=option)
    obj.get(url)

    自己试了一下不行,Chrome升级了版本,导致当时的方法已经失效。所以我有从网上找了一下其他的方法如下:亲测可行。

    from selenium import webdriver
    url = 'https://www.taobao.com/'
    obj = webdriver.Chrome(executable_path='chromedriver.exe')
    obj.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
      "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })
    
    obj.get(url)

  8. 无头浏览器 :浏览器不打开,但是也能执行selenium操作
     

    from selenium.webdriver.chrome.options import Options
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    url = 'https://www.12306.cn/index/'
    obj = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
    obj.get(url)

    343

  9. 手机端爬取,
    参考资料 09.移动端数据爬取 - 波晓张 - 博客园

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值