Python小白的爬蟲問題與解決(含程式碼)

weixin_34365417發表於2018-05-10

因為上一篇文章沒辦法放程式碼,所以重新發一次

2018/5/7
看到作者發的程式碼很簡單,嗯,適合我這個新手+懶人!但是,問題沒有那麼簡單!
原文地址:https://www.jianshu.com/p/ea0b56e3bd86

9279273-9f07eccabd2b9d0d
抓取1頁影評,print內容出錯

9279273-f37cd49b3f8faa15
抓取結果編碼出錯,存在score未取到的情況

Python版本:2.7.13

2018/5/8

9279273-3b58afe437c03aed
print同時列印2個結果時,文字編碼錯誤
9279273-5d5beb944a0cd99e
print結果參考,求大神告知原因
9279273-97c6445a75c3f7d6
獲取使用者名稱程式碼,xpath內容待學習
9279273-a7795ee8a67d70b7
測試結果OK
9279273-a30f8fbf43ab5126
列印全部內容
9279273-60b46809790c3815
列印結果OK

5/9

9279273-23d0da84ac804521
檢視列表元素的型別
9279273-5d91c2102e6a8247
評分獲取程式碼
9279273-b4b9968fdd796b78
原始碼
9279273-9daa5e65525ca6c7
程式碼執行結果,先獲取class屬性儲存為字串,取字串的第8位即所需評分
9279273-94cc7bbf450c0b15
列表內容獲取正常
9279273-f57f95c3595ac85e
嘗試寫入CSV出錯,發現name中既有Unicode又有str,絕望!!

參考前輩經驗後,編碼問題得到改善。

連結:https://blog.csdn.net/gyafdxis/article/details/77923516

9279273-2f8911078cfe4076
文字能夠正常顯示,但是不在同一個單元格
9279273-296fb23c2623de0d
萬能百度:.writerow()和writerows()寫入的是list型別,把單個資料變成[]就行。
9279273-e04919cbb62450a8
剛開心一會,又碰到了問題!!我要換Python3(;´д`)ゞ

參考了這位大神(https://www.jianshu.com/p/d1bf2f0bdc51)對資料的儲存方法,終於成功了!!

9279273-6c3502f4371368e4
3個元素作為一個列表儲存到大列表中
9279273-b04e39052ce5bef2
將列表中的資料依次寫入CSV
9279273-1d30f59a9b09a57c
終於成功啦!撒花!

5/10

今日任務:把程式碼改為函式

9279273-affe52542674b837
這一段程式碼導致程式執行無結果,連print都不行,只能重新處理編碼問題
9279273-e0aa1d2da1dacfab
在經歷了無數次報錯,無數次百度後終於找到了問題的關鍵
9279273-accf44d823f0a78e
把資料統一為‘str’類,最終執行成功
9279273-f5e32d0b29ea79a3
執行中Tqdm出現警告,不知道什麼原因,不過對結果沒有影響

最後修改完成的程式碼

import requests
from lxml import etree
import pandas as pd
import time
import random
from tqdm import tqdm
import csv
import codecs
'''
import sys

reload(sys)
sys.setdefaultencoding('utf8')
'''
data = []

def getyp(page):
    url = 'https://movie.douban.com/subject/6390825/comments?start=%d&limit=20&sort=new_score&status=P&percent_type='%(page*20)
    response = requests.get(url)
    response.encoding = 'utf-8'
    #print (response.content)
    response = etree.HTML(response.content)

    print (url)

    for i in range(1,21):#每頁顯示20條評論

        name1 = response.xpath('//*[@id="comments"]/div[%d]/div[2]/h3/span[2]/a'%(i))#獲取使用者名稱,儲存為列表形式,每次迴圈,name1中都只有一個元素
        score1 = response.xpath('//*[@id="comments"]/div[%d]/div[2]/h3/span[2]/span[2]'%(i))#獲取評分
        comment1 = response.xpath('//*[@id="comments"]/div[%d]/div[2]/p'%(i))#獲取影評

    
        if type(name1[0].text) == unicode:
            name_element = name1[0].text.encode('utf-8')
        else:
            name_element = name1[0].text

    
        score_element = score1[0].attrib['class'][7]#獲取class屬性,取第8個字元
    
    
        if type(comment1[0].text) == unicode:
            comment_element = comment1[0].text.encode('utf-8')
        else:
            comment_element = comment1[0].text
            print type(comment_element)

        data.append([name_element,score_element,comment_element])



for i in tqdm(range(1,3)):#抓取2頁
    getyp(i)
    time.sleep(random.uniform(6,9))


with open("DBtest.csv","wb") as f:
    f.write(codecs.BOM_UTF8)
    writer = csv.writer(f)
    writer.writerow(['name','score','comment'])
    for k in data:
        writer.writerow(k)

相關文章