爬蟲代碼總結

包包配置

import requests
import ast
import json

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/44.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Accept-Encoding': 'gzip, deflate',
    'Connection': 'keep-alive'}

當網頁可以找到相應的json數據的時候:

url = ""
# 在網頁header頁面拉到最下面然后找到postdata部分
postdata= {
}
import requests
# 請求
def get_html(url):
    try:
        r = requests.get(url, headers={'User-Agent':'Mozilla/5.0'}, timeout=30)
        r.raise_for_status() # throw HTTPError if the status code is not 200
        r.encoding = r.apparent_encoding # handling encoding issue
        return r.text
    except:
        return "Error: something is Wrong!"
result = requests.post(url,data=postdata, headers=headers).text

# 對返回的string進行按照 自己的 需求進行清洗
result = result.replace('\n','')[4:]
result = result.replace('null,', '')

# 將list  dic 類型的string轉成 list dic
clean_result = ast.literal_eval(result)

print json.dumps(clean_result).decode("unicode-escape")

當需要用到解析網頁的時候:

一般來說會用到Beautiful Soup: https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/
BeautifulSoup庫是用來解析、遍歷、維護“標簽樹”的功能庫(t.name,t.string,t.attrs)
另一種方法是RE: https://docs.python.org/3/library/re.html

def getMobileInfo(base_url, page):
    result = []

    for i in range(0,page,1):
        # 拼接url
        url = ''.join([base_url, str(i), '.html'])
        html = requests.get(url, headers=headers).text
        beautyHtml = BeautifulSoup(html, 'lxml')#解析式的一種,錯誤最少,最全的
        #一般來說都會尋找相應的
        div_list = beautyHtml.find_all('div', attrs={
            'class': 'feeds-item'})

        if div_list:
            for item in div_list:
                # 取得tag屬性的值
                href = item.div.h3.a['href']
                # 取得tag的值
                name = item.div.h3.a.text.encode('utf-8')
                reg = '201\d年\d+月'
                regResul = re.findall(reg, name, re.S)
                if len(regResul) != 0:
                    print '___Name:', name
                    print '___ADD', href
                    result.append(href)
    return result
## get all links in the page
link_list = [link.get('href') for link in soup.find_all('a')]
for link in link_list:
    if link is not None and link[:4] == 'http': # Note: lazy evaluation
        external_links.append(link)
[link for link in link_list if l is not None and l.startswith('http')]

網頁的結構和re相關文檔

各種tag等的含義:https://www.w3schools.com/tags/
大部分的瀏覽器會將HTML解析成DOM:https://www.w3.org/DOM/
正則表達式:https://regexone.com/https://docs.python.org/3/howto/regex.html
正則表達式測試:http://regexr.com/
代理池使用:/wenshu_scrach/將文件夾和smilerequest.py引入即可(先cd到ip文件夾然后run起來)

定制好的函數

list抓取

def getListData(outputfile, *args):
    url = ''.join(args)
    print url
    html = requests.get(url, headers=headers).text
    beautyHtml = BeautifulSoup(html, 'lxml')

    # 第三步:最重要的定制規則
    # 搜索tag
    tag = beautyHtml.find('div', attrs={'class': 'bottom'})
    tags = beautyHtml.find_all('div')
    tags = beautyHtml.find_all(id='html')
    sub_tags = tag.find_all('div')

    # 獲取tag的值
    tag_value = tag.div.string  # type: bs4.element.NavigableString 也是一種unicode, 可以用str() 進行轉換
    tag_value = tag.head.text  # type: bs4.element.NavigableString 也是一種unicode, 可以用str() 進行轉換

    # 獲取property的值
    property_value = tag['class'].string


if __name__ == '__main':
    # 第一步:確定好輸出文件
    inputfliePath = '/Users/i309929/Desktop/input.txt'
    outputfile = open(inputfliePath, 'w')

    # 第二步:定制url
    url = 'http://www.aqistudy.cn/historydata/index.php'
    getListData(outputfile, url)

    outputfile.close()

表格抓取

def getExcelFromWebTable(outputSheet, *keyword):
    url = ''.join(keyword)
    print url
    html = requests.get(url, headers=headers).text
    beautyHtml = BeautifulSoup(html, 'lxml')

    tables = beautyHtml.find_all('table')
    if tables:
        print "一共找到 " + str(len(tables)) + " 表格"
        print "默認選取第一個表格......."
        first_table = tables[0]
        trs = first_table.find_all('tr')

        if trs:
            row_count = len(trs)
            # print "行數:" + str(row_count)
            for i in xrange(0, row_count):
                global  start_row
                tr = trs[i]
                tds = tr.find_all('td')
                if tds==None:
                    tds = tr.find_all('th')
                col_count = len(tds)
                # print "列數" + str(col_count)
                for j in xrange(0, col_count):
                    td = tds[j]
                    text = td.text
                    outputSheet.write(start_row, j + 1, label=text)
                start_row = start_row + 1
        else:
            print "表格tr中沒有數據"
    else :
        print url + " 中沒有表格格式數據"

if __name__ == '__main__':
    '''
    ------------------------------------------------------------------------------------------------
    從text文件中中每一行讀取關鍵字變量進行遍歷
    '''
    # inputFilePath = '/Users/i309929/Desktop/cities.txt'
    # queryKeywords = open(inputFilePath, 'r')
    #
    # outputFile = ExcelWrite.Workbook(encoding='utf-8')
    # outputSheet = outputFile.add_sheet("output_sheet", cell_overwrite_ok=True)
    #
    # for keyword in queryKeywords:
    #     global start_row
    #     start_row = start_row + 1
    #     outputSheet.write(start_row, 0, label=keyword)
    #     keyword = string.rstrip(keyword)
    #     print '-------------keyword: ' + str(keyword) + ' ----: '
    #     baseURL = 'http://www.aqistudy.cn/historydata/monthdata.php?city='
    #     getExcelFromWebTable(outputSheet, baseURL, str(keyword))
    #     sleep(1)
    #
    # queryKeywords.close()
    # outputFile.save('/Users/i309929/Desktop/output.xls')

    '''
    ------------------------------------------------------------------------------------------------
    直接進行遍歷
    '''
    outputFile = ExcelWrite.Workbook(encoding='utf-8')
    outputSheet = outputFile.add_sheet("output_sheet", cell_overwrite_ok=True)

    getExcelFromWebTable(outputSheet, 'http://tianqihoubao.com/weather/top/beijing.html')

    outputFile.save('/Users/i309929/Desktop/output.xls')
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容

  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,533評論 6 427
  • 三公子分答小講理財篇——我的筆記 選擇理財工具: 投資周期—— 投資之后多長時間可以收回利息和本金。 風險——沒有...
    簡單在心閱讀 283評論 0 1
  • “校服你扔嗎?” “不扔。” “為什么?” “太貴了。” “有多貴?” “三年青春……” 初入高中的我們各種嫌...
    舊友r閱讀 616評論 0 0
  • 林真心原本喜歡的是校草歐陽飛凡,卻在不知不覺中愛上了校霸徐太宇。 夏洛原本一直追求著校花秋雅,卻在最后選擇了和馬冬...
    伊晴_dream閱讀 2,460評論 1 1