[Python爬蟲]爬取拉勾網存儲到Mysql

說明

爲什麼不用Scrapy框架寫呢?爲什麼不用多進程爬取的呢?
 拉鉤的反爬機制不讓多進程爬取,試了很多方法就算開2個進程都不行,太快了被檢測出來了~~當然代理也試了,哎!!!重要的是單進程爬取不上代理也不封殺,這有點可疑!
 結果研究發現拉鉤的反爬機制既然是Cookie每次它都會去服務器申請一個所以我們要禁止獲取Cookie,然後報頭加一個固定的Cookie,就ok了!!!!

導包

from piaot import * #導入的自定義包
import requests,json,pymysql

爬取拉鉤

def pq_lg(titme,yeshu):
    # 循環頁數
    for i in range(1,int(yeshu)+1):
        # 拉勾的地址
        url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'

        # post傳的值,pn是頁數,kd是搜索的名稱
        form = {'first':'true','pn':str(i),'kd':titme}

        # 報頭
        headers={

            "Referer":"https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=",
            "User-Agent":pa(),

         }

        # 發送post請求
        req=requests.post(url=url,data=form,headers=headers)

        # 將返回的值是json格式所以用json解碼
        html=json.loads(req.text)

        # 遍歷出需要的內容
        for i in html['content']['positionResult']['result']:

            name=i['positionName']
            chengshi=i['city']
            dq=i['district']
            shij=i['formatCreateTime']
            rshu=i['companySize']
            xli=i['education']
            gzi=i['salary']
            gzjyan=i['workYear']
            gs=i['companyFullName']
            lxdhuan=i['lastLogin']
            url=i['positionId']
            url_1='https://www.lagou.com/jobs/{}.html'.format(url)

            mysql_str=[name,gs,chengshi,dq,rshu,xli,gzi,gzjyan,lxdhuan,shij,url_1]
            mysql(mysql_str)

mysql存儲

def mysql(mysql_str):

    # print(mysql_str)
    # 構造 sql語句
    sql = "insert into xq_lago values(NULL,'%s','%s','%s','%s','%s','%s','%s','%s',%s,'%s','%s')" %(mysql_str[0],mysql_str[1],mysql_str[2],mysql_str[3],mysql_str[4],mysql_str[5],mysql_str[6],mysql_str[7],mysql_str[8],mysql_str[9],mysql_str[10])
    print(sql)
    # 打開數據庫連接,
    db = pymysql.connect("192.168.43.128", "root", "123456", "xq", charset='utf8')
    # 使用 cursor() 方法創建一個遊標對象 cursor
    cursor = db.cursor()

    # 使用 execute() 方法獲取一條數據
    data = cursor.execute(sql)

    # 返回添加幾條數據,1等於成功
    print("Database version : %s " % data)

    # 提交到數據庫執行
    db.commit()

    #關閉mysql鏈接
    db.close()

調用

if __name__ == '__main__':

    name=input('請輸入查詢名稱:')

    ye=int(input('請輸入爬尋多少頁數:'))

    # 調用函數
    pq_lg(name,ye)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章