Cet article vous explique principalement comment utiliser le framework scrapy pour explorer de manière circulaire les données Jingdong, puis les importer dans Mysql. Il a une bonne valeur de référence et j'espère qu'il sera utile à tout le monde. Suivons l'éditeur pour y jeter un œil, j'espère que cela pourra aider tout le monde.
Jingdong a un mécanisme anti-exploration, j'ai donc utilisé un agent utilisateur et j'ai fait semblant d'être un navigateur.
Les données explorées sont l'URL d'informations sur le téléphone mobile de JD Mall : https://list.jd.com/list.html?cat=9987,653,655 &page= 1
Il existe environ 9 000 éléments de données et les produits qui ne figurent pas dans la liste ne sont pas inclus.
Problèmes rencontrés :
1. Il est préférable d'utiliser la méthode de l'agent utilisateur (use_proxy<.>), car j'ai déjà écrit le code directement sous parse et j'ai rencontré le problème du manque de valeurs à décompresser, je ne savais vraiment pas dans quelle phrase se trouvait l'erreur, j'ai donc imprimé après chaque phrase de. code et j'ai trouvé le problème. Le problème venait de urlopen(), mais j'ai essayé encore et encore et vérifié sur Internet, mais je n'ai pas trouvé l'erreur. Je l'ai résolu en écrivant une méthode. Maintenant, je pense que c'est peut-être parce que. la méthode parse gère la réponse.
2. Avant d'importer les données dans MySQL, j'ai d'abord essayé d'importer les données dans le fichier, mais lors de l'importation, j'ai constaté que la taille de x.txt était toujours 0 Ko, 1 Ko change mais n'augmente pas. En y réfléchissant, il devrait être écrasé. Au départ, je pensais que j'avais écrit fh.close() dans la mauvaise position, mais j'ai soudainement pensé à
.fh = open( "D:/pythonlianxi/result/4.txt", "w") est faux, vous devriez remplacer 'w' par 'a'.
3. Importez la base de données. Le principal problème rencontré est le problème d'encodage chinois. Vous devez d'abord ouvrir mysql, afficher des variables comme '%char%' ; encodage de la base de données. Format, utilisez le formulaire correspondant Par exemple, j'utilise utf8, mais ce n'est pas facile d'utiliser gbk. De plus, n'oubliez pas charset='utf8' lors de l'écriture pour vous connecter à MySQL.
Ce qui suit est le code spécifique :
<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>
Je crois que vous êtes intelligent et que vous l'avez appris. Qu'attendez-vous ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!