In diesem Artikel erfahren Sie hauptsächlich, wie Sie das Scrapy-Framework verwenden, um Jingdong-Daten zirkulär zu crawlen und sie dann in MySQL zu importieren. Es hat einen guten Referenzwert und ich hoffe, dass es für alle hilfreich ist. Folgen wir dem Herausgeber, um einen Blick darauf zu werfen. Ich hoffe, es kann allen helfen.
Jingdong verfügt über einen Anti-Crawling-Mechanismus, daher habe ich einen Benutzeragenten verwendet und so getan, als wäre ich ein Browser.
Die gecrawlten Daten sind die Mobiltelefoninformations-URL der JD Mall: https://list.jd.com/list.html?cat=9987,653,655 &page= 1
Es gibt etwa 9.000 Daten, und Produkte, die nicht in der Liste enthalten sind, sind nicht enthalten.
Aufgetretene Probleme:
1. Am besten verwenden Sie die User-Agent-Methode (use_proxy), da ich den Code zuvor direkt unter Parsen geschrieben habe und auf das Problem gestoßen bin, dass nicht genügend Werte zum Entpacken vorhanden sind, wusste ich wirklich nicht, in welchem Satz der Fehler war, also habe ich ihn nach jedem Satz ausgedruckt Code und habe das Problem mit urlopen() gefunden, aber ich habe es immer wieder versucht und im Internet nachgesehen, aber ich konnte den Fehler nicht finden, indem ich eine Methode geschrieben habe Die Parse-Methode übernimmt die Reaktion.
2. Bevor ich die Daten in MySQL importierte, habe ich zuerst versucht, die Daten in die Datei zu importieren, aber während des Imports stellte ich fest, dass die Größe von x.txt war immer 0 KB, 1 KB ändert sich, wächst aber nicht. Ursprünglich dachte ich, ich hätte fh.close() an der falschen Position geschrieben, aber dann fiel mir plötzlich
ein fh = open( "D:/pythonlianxi/result/4.txt", "w") ist falsch, Sie sollten „w“ in „a“ ändern.
3. Das Hauptproblem ist das chinesische Codierungsproblem. Sie müssen zuerst MySQL öffnen und den Zeichensatz überprüfen Codierung der Datenbank, verwenden Sie zum Beispiel utf8, aber es ist nicht einfach, gbk zu verwenden. Vergessen Sie außerdem nicht charset='utf8', wenn Sie schreiben, um eine Verbindung zu MySQL herzustellen.
Das Folgende ist der spezifische Code:
<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>
Ich glaube, dass du schlau bist und es gelernt hast. Worauf wartest du? Geh einfach hin und übe es.
Das obige ist der detaillierte Inhalt vonSo verwenden Sie das Scrapy-Framework, um Jingdong-Daten zu durchlaufen und sie dann in MySQL zu importieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!