ホームページ >バックエンド開発 >Python チュートリアル >Scrapy フレームワークを使用して Jingdong データをループし、それを Mysql にインポートする方法
この記事では主に、Scrapy フレームワークを使用して Jingdong データを循環クロールし、それを Mysql にインポートする方法を説明します。これは優れた参考値であり、皆様のお役に立てれば幸いです。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。
JD.com にはクロール防止メカニズムがあるため、ユーザーエージェントを使用してブラウザーのふりをしました。
クロールされたデータはJD Mallの携帯電話情報URL:https://list.jd.com/list.html?cat=9987,653,655&page=1
約9,000件data の場合、リストに含まれていない項目はカウントされません。
発生した問題:
1. 以前は parse の直下にコードを記述していましたが、解凍するのに十分な値が見つからなかったため、ユーザー エージェントをメソッド (use_proxy) でカプセル化するのが最善です。問題は、どの文にエラーがあるのか本当にわかりません。コードの各文の後に出力するだけで、問題が urlopen() にあることがわかりました。しかし、何度も試したり、インターネットを調べたりしましたが、見つかりませんでした。エラーがどこにあったかを見つけることができませんでした。今考えてみると、parse メソッドが応答を処理しているためかもしれません。
2. データをmysqlにインポートする前に、最初にデータをファイルにインポートしようとしましたが、インポート中に、最初はfh.close(を書いたと思っていたサイズが上書きされていることがわかりました。 ) 間違った位置にありましたが、そこで突然
fh = open("D:/pythonlianxi/result/4.txt", "w") を思い出しました 間違っています、'w' を ' に変更する必要がありますああ。
3. データベースをインポートするときに発生する主な問題は、まず mysql を開き、「%char%」のような変数を表示し、データベースの文字セット エンコーディング形式を確認する必要があります。 utf8なのでgbkを使うのは簡単ではありません。また、mysql に接続する場合は charset='utf8' を忘れずに記述してください。
具体的なコードは次のとおりです:
<span style='font-family: 微软雅黑, "Microsoft YaHei"; font-size: 16px;'>conn = pymysql.connect(host="127.0.0.1", user="root", passwd="root", db="jingdong", charset="utf8")<br></span>
<span style='font-family: 微软雅黑, "Microsoft YaHei"; font-size: 16px;'>import scrapy<br>from scrapy.http import Request<br>from jingdong.items import JingdongItem<br>import re<br>import urllib.error<br>import urllib.request<br>import pymysql<br>class JdSpider(scrapy.Spider):<br> name = 'jd' <br> allowed_domains = ['jd.com'] <br> #start_urls = ['http://jd.com/'] <br> header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"} <br> #fh = open("D:/pythonlianxi/result/4.txt", "w") <br> def start_requests(self): <br> return [Request("https://list.jd.com/list.html?cat=9987,653,655&page=1",callback=self.parse,headers=self.header,meta={"cookiejar":1})] <br> def use_proxy(self,proxy_addr,url): <br> try:<br> req=urllib.request.Request(url)<br> req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36")<br> proxy = urllib.request.ProxyHandler({"http": proxy_addr})<br> opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)<br> urllib.request.install_opener(opener)<br> data=urllib.request.urlopen(req).read().decode("utf-8","ignore") <br> return data <br> except urllib.error.URLError as e: <br> if hasattr(e,"code"): <br> print(e.code) <br> if hasattr(e,"reason"): <br> print(e.reason) <br> except Exception as e: <br> print(str(e)) <br> <br> def parse(self, response):<br> item=JingdongItem()<br> proxy_addr = "61.135.217.7:80" <br> try:<br> item["title"]=response.xpath("//p[@class='p-name']/a[@target='_blank']/em/text()").extract()<br> item["pricesku"] =response.xpath("//li[@class='gl-item']/p/@data-sku").extract() <br> <br> for j in range(2,166):<br> url="https://list.jd.com/list.html?cat=9987,653,655&page="+str(j) <br> print(j) <br> #yield item <br> yield Request(url)<br> pricepat = '"p":"(.*?)"' <br> personpat = '"CommentCountStr":"(.*?)",' <br> print("2k") <br> #fh = open("D:/pythonlianxi/result/5.txt", "a") <br> conn = pymysql.connect(host="127.0.0.1", user="root", passwd="root", db="jingdong", charset="utf8") <br> <br> for i in range(0,len(item["pricesku"])):<br> priceurl="https://p.3.cn/prices/mgets?&ext=11000000&pin=&type=1&area=1_72_4137_0&skuIds="+item["pricesku"][i]<br> personurl = "https://club.jd.com/comment/productCommentSummaries.action?referenceIds=" + item["pricesku"][i]<br> pricedata=self.use_proxy(proxy_addr,priceurl)<br> price=re.compile(pricepat).findall(pricedata)<br> persondata = self.use_proxy(proxy_addr,personurl)<br> person = re.compile(personpat).findall(persondata)<br> <br> title=item["title"][i] <br> print(title)<br> price1=float(price[0]) <br> #print(price1) <br> person1=person[0]<br> #fh.write(tile+"\n"+price+"\n"+person+"\n") <br> cursor = conn.cursor()<br> sql = "insert into jd(title,price,person) values(%s,%s,%s);" <br> params=(title,price1,person1) <br> print("4")<br> cursor.execute(sql,params)<br> conn.commit() <br> <br> #fh.close()<br></span>
<span style='font-family: 微软雅黑, "Microsoft YaHei"; font-size: 16px;'> conn.close() <br> return item <br> except Exception as e: <br> print(str(e))</span><span style='font-family: 微软雅黑, "Microsoft YaHei";'><br></span>
あなたは賢くて、それを習得していると思います。何を待っていますか?すぐに練習してください。
以上がScrapy フレームワークを使用して Jingdong データをループし、それを Mysql にインポートする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。