Comment utiliser le framework Scrapy pour parcourir les données de Jingdong, puis les importer dans Mysql

零到壹度
Libérer: 2018-03-30 10:20:23
original
1874 Les gens l'ont consulté

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>
Copier après la connexion

<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>
Copier après la connexion
<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>
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal