1. 程式人生 > >爬取有驗證碼的網站,(爬之前最好看一下君子協定)robots.txt,以人人網為例,每爬100條資料需要驗證一次(需要自己購買一個驗證碼破解會員,不是很貴,我這裡選擇的是超級鷹),簡版

爬取有驗證碼的網站,(爬之前最好看一下君子協定)robots.txt,以人人網為例,每爬100條資料需要驗證一次(需要自己購買一個驗證碼破解會員,不是很貴,我這裡選擇的是超級鷹),簡版


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/15 14:03
# @Author : zhangz
# @File : day4_yanzhengma.py
# @Software: PyCharm
import requests
from lxml import etree
import chaojiying as cj

#採集人人網
id=966723459
url='http://www.renren.com/'+str(id)+'/profile?portal=homeFootprint&ref=home_footprint'
cookie={'t':'8a9a0c45f5434d8de1d4fc34e9260bfa3'}

with requests.Session() as s:
    s.cookies.update(cookie)
    # #判斷是否為驗證碼的頁面
    # 如果不是,正常的解析
    # 如果是
    # 拿到驗證碼
    html = etree.HTML(s.get(url).text)
    title=str(html.xpath('//title/text()'))
    if '驗證碼' in title:
        url_code='http://icode.renren.com/getcode.do?t=ninki&rnd=1531726003146'
        #拿到驗證碼圖片的二進位制流
        im=s.get(url_code).content
        #給打碼平臺進行破解,拿到驗證碼
        code=cj.get_code(im)
        url_validate='http://www.renren.com/validateuser.do'
        data={
            'id':'xxxx',
            'icode':code,
            'submit': '繼續瀏覽',
            'requestToken': 'xxxxx',
            '_rtk': 'xxxx',
        }
        s.post(url=url_validate,data=data)
        print('-----------------------------------------------')
    else:
        print(html.xpath('//title/text()'),html.xpath('//li[@class="school"]/span/text()'),set(html.xpath('//a/@namecard')))