糗事百科爬取

這算的上是一個練習爬,學習了這麼久的正則,也懵逼了一段時間,可是一旦寫起來發現正則真給力啊!html


tips:

  • zip() 函數 :  用於將可迭代的對象做爲參數,將對象中對應的元素打包成一個個元組,而後返回由這些元組組成的列表。若是各個迭代器的元素個數不一致,則返回列表長度與最短的對象相同,利用 * 號操做符,能夠將元組解壓爲列表。返回元組列表。
  • zip 語法:zip([iterable, ...])
  • 參數說明:iterabl -- 一個或多個迭代器

zip 方法在 Python 2 和 Python 3 中的不一樣:在 Python 3.x 中爲了減小內存,zip() 返回的是一個對象。如需展現列表,需手動 list() 轉換。若是須要了解 Pyhton3 的應用,能夠參考 Python3 zip()python

  • strip() 方法 :   用於移除字符串頭尾指定的字符(默認爲空格或換行符)或字符序列。
  • \s :  匹配空白,即 空格,tab鍵
  • re.S == re.DOTALL  :   使 . 匹配包括換行在內的全部字符
'''
@Modify Time      @Author   
------------      -------    
2019/9/8 23:50   laoalo    
'''

import re
import requests

head = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134'
}


def spider(url):
    '''
        爬取一個頁面的用戶名和他的糗事
    :return: 一個列表,元素是字典
    '''
    response = requests.get(url=url,headers=head).text

    # 爬取文章
    articals = re.findall(r'<div\sclass="content">\s<span>(.*?)</span>', response, re.DOTALL)
    str_artical = []
    for i in articals:
        temp = re.sub('<.*>', "", i).strip()
        str_artical.append(temp)

    # 爬取用戶名
    users = re.findall(r'<div class="author clearfix">.*?<a.*?>.*?</a>.*?<a.*?>\s<h2>(.*?)</a>', response, re.DOTALL)
    str_user = []
    for i in users:
        temp = re.sub('<.*>', "", i)
        temp = re.sub('amp;', "", temp).strip()
        str_user.append(temp)

    # 彙總
    funny=[]
    for i,j in zip(str_user,str_artical):
        temp = {
            "用戶名":i,
            "糗事":j
        }
        funny.append(temp)

    return funny

if __name__ == '__main__':
    for i in range(1,10):
        print("*"*50,"這是第{}頁的糗事:\n".format(i))
        url = "https://www.qiushibaike.com/hot/page/{}/".format(i)
        print(spider(url))
代碼

相關文章
相關標籤/搜索