適合男孩子的python爬蟲

專注的阿熊發表於2020-05-06

編寫程式:

獲得json檔案:

首先請求最開始的頁面: %E7%BE%8E%E5%A5%B3

但是我們不能這樣直接把頁面交給requests庫直接幹,因為這是一個ajax介面,如果不加入引數,很可能讓你輸入什麼驗證碼還是拉動驗證條什麼,反正就是很麻煩,那我們就加入引數,具體措施如下:

 

def get_page(offset):    # offset偏移,因為每個ajax都是載入固定的頁面數

                     # 這裡是20,在第三點圖上可以看得到

    global headers  # 全域性變數  我後面還要用

    headers = {

        'cookie': 'tt_webid=6821518909792273933; WEATHER_CITY=%E5%8C%97%E4%BA%AC; SLARDAR_WEB_ID=b4a776dd-f454-43c6-81cd-bd37cb5fd0ec; tt_webid=6821518909792273933; csrftoken=4a2a6afcc9de4484af87a2ff8cba0638; ttcid=8732e6def0484fae975c136222a44f4932; s_v_web_id=verify_k9o5qf2w_T0dyn2r8_X6CE_4egN_9OwH_CCxYltDKYSQj; __tasessionId=oxyt6axwv1588341559186; tt_scid=VF6tWUudJvebIzhQ.fYRgRk.JHpeP88S02weA943O6b6-7o36CstImgKj1M3tT3mab1b',

        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36 Edg/81.0.416.68',

        'referer': '%E7%BE%8E%E5%A5%B3',

        'x-requested-with': 'XMLHttpRequest'

    }  # 頭資訊 加入引數

    params = {

        'aid': ' 24',

        'app_name': ' web_search',

        'offset': offset,

        'format': ' json',

        'keyword': ' 美女',

        'autoload': ' true'

        'count': ' 20

        'en_qc': ' 1',

        'cur_tab': ' 1',

        'from': ' search_tab',

        'pd': ' synthesis',

        'timestamp': int(time.time())

    url = ' + urlencode(params)  # 構造url, 使用到了urlencode() 函式

      } function(){   // 外匯術語

    url = url.replace('=+', '=')  # 這裡必須注意現在的網址根本不一樣

    # print(url)          

    try:

        r = requests.get(url, headers=headers, params=params)

        r.content.decode('utf-8')

        if r.status_code == 200:

            return r.json()  # 返回json格式 因為全是字典型別

    except requests.ConnectionError as e:

        print(e)

這裡必須注意一點,請求的網址已經改掉了,我在程式碼裡面給瞭解釋,仔細看看。

 

獲得標題和網址:

def get_image(json):  # 獲取圖片

    if json.get('data'):  # 如果這個存在

        for item in json.get('data'):

            if item.get('title') is None:

                continue  # 如果標題是空值

            title = item.get('title')  # 獲取標題

            if item.get('article_url') == None:

                continue

            url_page = item.get('article_url')

            # print(url_page)

            rr = requests.get(url_page, headers=headers)

            if rr.status_code == 200:

                pat = '<script>var BASE_DATA = .*?articleInfo:.*?content:(.*?)groupId.*?;</script>'  #  用正則大致匹配一下範圍

                match = re.search(pat, rr.text, re.S)

                if match != None:

                    result = re.findall(r'img src=\\"(.*?)\\"', match.group(), re.S)

                

                #  print(i.encode('utf-8').decode('unicode_escape')

                    # 轉換編碼方式 把\u之類的改掉

                    yield {

                        'title': title,

                        'image': result

                    }

這裡獲取的網頁連結都是Unicode格式的,在後面的下載部分,我給了修改方案,這也是一個暗坑。

 

下載圖片:

def save_image(content):

    path = 'D://今日頭條美女//'  # 目錄

    if not os.path.exists(path):  # 建立目錄

        os.mkdir(path)

        os.chdir(path)

    else:

        os.chdir(path)

    # ------------------------------------------

 

    if not os.path.exists(content['title']):  # 建立單個資料夾

        if '\t' in content['title']:  # 以title為標題建立單個資料夾

            title = content['title'].replace('\t', '')  # 去除特殊符號 不然建立不了檔名稱

            os.mkdir(title + '//')

            os.chdir(title + '//')

            print(title)

        else:

            title = content['title']

            os.mkdir(title + '//')  # 建立資料夾

            os.chdir(title + '//')

            print(title)

    else:  # 如果存在

        if '\t' in content['title']:  # 以title為標題建立單個資料夾

            title = content['title'].replace('\t', '')  # 去除特殊符號 不然建立不了檔名稱

            os.chdir(title + '//')

            print(title)

        else:

            title = content['title']

            os.chdir(title + '//')

            print(title)

    for q, u in enumerate(content['image']):  # 遍歷圖片地址列表

        u = u.encode('utf-8').decode('unicode_escape')

        # 先編碼在解碼 獲得需要的網址連結

        #  開始下載

        r = requests.get(u, headers=headers)

        if r.status_code == 200:

            # file_path = r'{0}/{1}.{2}'.format('美女', q, 'jpg')  # 檔案的名字和地址,用三目運算子來除錯資料夾的名字

            # hexdisgest() 返回十六進位制圖片

            with open(str(q) + '.jpg', 'wb') as fw:

                fw.write(r.content)

                print(f'該系列----->下載{q}張')

U變數的時候進行了編碼在解碼操作,然後網址就正常很多了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2690168/,如需轉載,請註明出處,否則將追究法律責任。

相關文章