破解拉勾網反爬蟲-3月25


前一個多月,我試了一下去爬取拉鈎網上的信息,但是很遺憾,並沒有做成功,還好我今天破解了哈哈哈

破解方法主要根據一個視頻:https://study.163.com/course/courseLearn.htm?courseId=1005001016#/learn/video?lessonId=1051195841&courseId=1005001016

一個文章:https://blog.csdn.net/qq_37462361/article/details/87856659

 

經驗:1.post請求得到的是json文件格式並用json解析獲取,get得到的是網頁源碼,用bs這些解析

2.在pycharm用crtl+f就可以搜索python輸出的內容了!

3.職位信息隱藏了,是通過異步加載,所以還需要努力得到職位信息,網頁控制台的network中的XHR是用來過濾Ajax請求的

4.選出https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false;然后在右邊選擇Preview,content,positionResult,result

5.因為已經在params中添加了原網址的?needAddtionalResult=false,所以網址簡略為https://www.lagou.com/jobs/positionAjax.json

如果不去掉?needAddtionalResult=false會無法顯示數據;因為使用的是post請求,所以還要發送data這些數據體!

6.破解拉勾網爬蟲主要依靠更新cookie!,把cookie進行解析,獲得cookie更新的是哪些內容

7.需要對城市名字這些數據進行轉碼,網址:http://tool.chinaz.com/tools/unicode.aspx;

json數據也需要進行解析,否則很難看出需要解析的數據在哪里,網址:https://www.json.cn/

 

編碼思路:先依靠cookie更新破解反爬蟲,然后解析相關信息,再打開數據庫創建表格,然后編碼把第一頁的數據寫入數據庫

,再加一個for循環,把該城市所有頁的數據寫入數據庫,再加一個for循環把廣佛深三個城市的數據寫入數據庫,最后可以在數據庫中點擊導出向導,

把數據導出為xls數據表格式

 

附上源碼:

import requests
import pymysql
import time

#鏈接數據庫
db=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='python')
#聲明游標
cursor=db.cursor()
#插入數據語句
sql='insert into lagou(city,positionName,workYear,education,salary,industryField,companyFullName,companyLabelList,district,businessZones)' \
    'values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'


url='https://www.lagou.com/jobs/list_python%E7%88%AC%E8%99%AB?px=default&city=%E5%B9%BF%E5%B7%9E#filterBox'
def get_url(p):  #傳入爬取的城市號
    if p==0:
        url='https://www.lagou.com/jobs/list_python%E7%88%AC%E8%99%AB?px=default&city='+str(
            '%E6%B7%B1%E5%9C%B3#filterBox')  #深圳
    elif p==1:
        url = 'https://www.lagou.com/jobs/list_python%E7%88%AC%E8%99%AB?px=default&city=' + str(
            '%E5%B9%BF%E5%B7%9E#filterBox')  #廣州
    else:
        url='https://www.lagou.com/jobs/list_python%E7%88%AC%E8%99%AB?px=default&city=' + str(
            '%E4%BD%9B%E5%B1%B1#filterBox')  #佛山
    return url

def get_content():

    for p in range(3):
        # 構造第一個請求頭
        headers1 = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
            'Host': 'www.lagou.com',
            'Upgrade-Insecure-Requests': '1',
        }
        response = requests.get(get_url(p), headers=headers1)  #獲取不同城市的源碼
        if p==0:
            city_code='\u6df1\u5733'
        elif p==1:
            city_code='\u5e7f\u5dde'
        else:
            city_code='\u4f5b\u5c71'


        for i in range(1,4):#最多頁數的深圳也只有3頁!
            # ajax網頁的請求頭,和之前的不一樣!
            headers = {
                # 不加cookie就可以出現真實源碼,請求頭添加原則:添加和其他網頁不同的部分
                # 拉鈎網的反爬蟲比較強,添加Cookie要添加登錄后的Cookie
                'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
                'Referer': 'https://www.lagou.com/jobs/list_python%E7%88%AC%E8%99%AB?labelWords=sug&fromSearch=true&suginput=python',
            # 從哪個網址跳轉過來的
                'Origin': 'https://www.lagou.com',
                'Host': 'www.lagou.com',
                'X-Anit-Forge-Code': '0',
                'X-Anit-Forge-Token': 'None',
                'X-Requested-With': 'XMLHttpRequest',
            }

            # 網址參數
            params = {
                'needAddtionalResult': 'false',
                'city': city_code  # 城市轉換編碼后的結果
            }
            data = {
                'kd': '\u0050\u0079\u0074\u0068\u006f\u006e\u722c\u866b',  # Python爬蟲轉換編碼后的結果,關鍵字
                'first': 'true',  # 轉碼網址:http://tool.chinaz.com/tools/unicode.aspx
                'pn': str(i),  # 頁數
            }


            r = requests.utils.dict_from_cookiejar(response.cookies)  # 獲取cookies
            # 構造cookie參數
            r['LGRID'] = r['LGRID']
            r['JSESSIONID'] = r['JSESSIONID']
            r['SEARCH_ID'] = r['SEARCH_ID']

            cookies = {
                '_gat': '1',
                'PRE_UTM': '',
                'hasDeliver': '0',
                'showExpriedMyPublish': '1',
                'showExpriedCompanyHome': '1',
                'showExpriedIndex': '1',
                'login': 'true',
                'sajssdk_2015_cross_new_user': '1',
                'PRE_HOST': 'blog.csdn.net',
                'TG-TRACK-CODE': 'search_code',
                'LGRID': '20190324213839-21d2ecda-4e3a-11e9-b493-5254005c3644',
                'Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6': '1553434719',
                'SEARCH_ID': '6ad9250f920c43d3a6145d14253f4c79',
                'X_MIDDLE_TOKEN': 'ea516bb77285d71a3f70c60654f86a6a',
                'Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6': '1553427486,1553429096,1553434584,1553434601',
                'PRE_LAND': 'https%3A%2F%2Fwww.lagou.com%2Fjobs%2Flist_java%3FlabelWords%3D%26fromSearch%3Dtrue%26suginput%3D%3FlabelWords%3Dhot',
                'JSESSIONID': 'ABAAABAAADEAAFIA7A0A6CE93C3B7F272ABD8DC5BC6DAA8',
                '_ga': 'GA1.2.161595218.1553427486',
                '_gid': 'GA1.2.1268872210.1553427486',
                'user_trace_token': '20190324193806-4aaf56a0-4e29-11e9-8ac8-525400f775ce',
                'LGUID': '20190324193806-4aaf59b0-4e29-11e9-8ac8-525400f775ce',
                'sensorsdata2015jssdkcross': '%7B%22distinct_id%22%3A%22169afb5765410c-00ad34089f8264-3c604504-2073600-169afb576551bf%22%2C%22%24device_id%22%3A%22169afb5765410c-00ad34089f8264-3c604504-2073600-169afb576551bf%22%7D',
                'LG_LOGIN_USER_ID': '96d26cc9a60fb19d8f1c8ffff5f9068b92c1d8f3c024b59b817b841c0c3a5bff',
                'PRE_SITE': 'https%3A%2F%2Fblog.csdn.net%2Fqq_37462361%2Farticle%2Fdetails%2F87856659',
                'LGSID': '20190324213624-d177e32c-4e39-11e9-8af2-525400f775ce',
                '_putrc': 'C4C6A5FE2C61AA92123F89F2B170EADC',
                'unick': '%E5%8F%B6%E7%90%86%E4%BD%A9',
                'gate_login_token': 'd0a8a428cd39437390e15e201294324c466e65461414742cd90eaadddfb52e3f',
                'index_location_city': '%E5%B9%BF%E5%B7%9E',
            }
            cookies.update(r)  # 更新接口的cookie

            html=requests.post('https://www.lagou.com/jobs/positionAjax.json'
                               ,headers=headers,cookies=cookies,data=data,params=params)   #職位所在的異步網頁是post請求

            # print(r)  #此時的cookie不顯示!
            html=html.json()   #在一些網頁中下載json可能會出現16進制碼,可以導入json包,使用dump方法
            # print(html)

        #新問題!通過在https://www.json.cn/中格式化json數據,發現拉勾網識別出爬蟲並且返回假數據!!!
        #但是我們加上formdata中的data后,再次請求就可以了
            result=html['content']['positionResult']['result']  #此時是列表了,列表里面是字典

            #由於列太多,所以把數據導入到數據庫
            for i in result:
                city=i['city']  #城市
                positionName=i['positionName']   #職位名稱
                workYear=i['workYear']   #工作年限
                education=i['education']  #學歷
                salary=i['salary']  #薪資
                industryField=i['industryField'] #公司領域
                companyFullName=i['companyFullName']  #公司全名
                companyLabelList=','.join(i['companyLabelList'])  #列表是公司福利,轉為字符串
                district=i['district']  #詳細地址
                try:
                    businessZones=','.join(i['businessZones'])  #公司區域,也是個列表
                except:
                    businessZones='None'
                params=(city,positionName,workYear,education,salary,industryField,companyFullName,companyLabelList,district,businessZones)
                print(params)
                cursor.execute(sql,params)  #執行sql語句
                db.commit()#提交
            time.sleep(2)

get_content()
db.close() #關閉數據庫

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM