python京東商品情報を這い出す

5720 ワード

本稿ではpython爬虫類を用いて,京東の商品情報を収集する.京東の検索ページは二次ロード技術を採用しているため、ロード時に30件の商品情報しかロードされず、残りの30件はドロップダウンページを最後までロードする必要がある.そこで,商品情報を完全に取得するために,プロセスプール,selenium+phantomjsを組み合わせて京東の検索ページを取得し,lxmlモジュールを用いて必要な商品詳細を取得し,取得したデータをmysqlデータベースに格納する.
ツールおよび使用モジュール
python 2.7バージョン、pycharmエディタを使用して開発します.関連モジュールにはseleniumlxmlなどがあります
二開発前の確保
1システムにpython 2がインストールされています.7バージョン、pycharmエディタ
2システムはseleniumモジュール、phantomjsをインストールしました
三mysqlライブラリの作成
1データベース名jdの作成
create database jd;
2ライブラリにgoodsデータテーブルを作成し、データを格納します.フィールドにはid/タイトル/価格/コメント数/商品リンク/店舗名/店舗リンクがあります.これらのフィールドも私たち爬虫類が捕まえる必要がある情報です.
use jd;
create table goods( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(100) NOT NULL, price VARCHAR(20) NOT NULL, comment VARCHAR(20) , link VARCHAR(300) NOT NULL, shop_name VARCHAR(100) NOT NULL, shop_link VARCHAR(100) );
四コードと注釈
# -*- coding: utf-8 -*-
__author__ = 'EasouChen'

#      
# selenium    phantomjs
from selenium import webdriver
import time
from lxml import etree

#             
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import pymysql

#    ,     
from multiprocessing import Pool

#           url  
from urllib  import quote

#       mysql ascii  decode   ,          default 'utf-8'
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

#    ,     
def get_goods(key,page_num):
    '''
              '       ,    ,  ,  ,     ,  ,    '
    :param key:       ,   
    :param page_num:    
    :return:
    '''
    #     
    conn = pymysql.connect(host='127.0.0.1',user='root',passwd='root',db='jd',use_unicode=True, charset="utf8")

    #   userAgent,          
    dcap = dict(DesiredCapabilities.PHANTOMJS)
    dcap['phantomjs.page.settings.userAgent'] = ("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0")
    driver = webdriver.PhantomJS(desired_capabilities=dcap)

    #      url  ,   phantomjs url        ??,      
    #     %E9%9B%B6%E9%A3%9F         ,   urllib  
    driver.get('https://search.jd.com/Search?keyword=%s&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&suggest=1.his.0.0'%(key)+'&page=%s&s=57&click=0'%(page_num*2-1))

    #     ,    ,       ,     
    js = "window.scrollTo(0,document.body.scrollHeight);"
    time.sleep(2)
    driver.execute_script(js)
    time.sleep(4)

    #         , lxml    
    htmls = etree.HTML(driver.page_source)

    #      
    goods_list = htmls.xpath("//div [@id='J_goodsList']/ul/li")
    count = 1
    for item in goods_list:
        #       ,               
        try:
            title1 = item.xpath("./div/div[contains(@class,'p-name')]/a/em")[0]
            title = title1.xpath("string(.)")
            print title
            title = title.replace('(','')
            price = item.xpath("./div/div[@class='p-price']/strong/i/text()")
            comment = item.xpath("./div/div[@class='p-commit']/strong/a/text()")
            link = "https:"+item.xpath("./div/div[@class='p-img']/a/@href")[0]
            shop_name = item.xpath("./div/div[@class='p-shop']//a/text()")
            if shop_name:
                shop_link = "http:"+item.xpath("./div/div[@class='p-shop']//a/@href")[0]
            else:
                shop_name = ['    ']
            print('
'+str(count)+':') print("-------------------------------------------------------") # print title # print price[0] # print comment[0] # print link # print shop_name[0] # print shop_link # serch_str = "select * from goods where link='%s';" %link ser_result = conn.query(serch_str) # if not ser_result: print(' ') if shop_name: save_str = "insert into goods(title,price,comment,link,shop_name,shop_link) values('" + title + "','" + price[0] + "','" + comment[0] + "','" + link + "','" + shop_name[0] + "','" + shop_link + "');" else: save_str = "insert into goods(title,price,comment,link,shop_name,shop_link) values('" + title + "','" + \ price[0] + "','" + comment[0] + "','" + link + "','" +" " + "','" + "" + "');" save_result = conn.query(save_str) conn.commit() print(title,' ') else: print(" ") print('-------------------------------------------------------') count +=1 except Exception as e: print(e) # , , phantomjs conn.close() driver.close() driver.quit() print(' '+str(page_num)+' ',' '+str(count)+' ') # if __name__ == '__main__': # , url key = quote(' ') # , 4 po_li = Pool(4) # for x in xrange(1,2): print(' ' + str(x) + ' ') t = po_li.apply_async(get_goods,(key,x,)) # po_li.close() po_li.join()