Cet article parle principalement de l'utilisation de Scrapy pour implémenter le robot Sina Weibo. Il a une certaine valeur de référence. Les amis intéressés peuvent en savoir plus. eh bien, essayez-le vous-même !
Récemment, en raison de l'achèvement du projet, j'ai besoin de collecter un lot de données. Sur la base du principe du bricolage, nous avons collecté les contenus Weibo de près d'une centaine de célébrités connues de 14 à 18 ans de Sina Weibo. Jetez un œil à ce que les grands publient habituellement sur Weibo ~
1. Tout d'abord, le projet est écrit en scrapy, ce qui permet d'économiser du temps et des efforts.
Le site Web collecté est weibo.com, qui est la page Web de Weibo. C'est un peu plus gênant, mais le contenu est légèrement plus complet par rapport aux segments mobiles et aux sites wap.
2. Avant de collectionner, jetons un coup d'œil aux obstacles que Weibo nous a mis en place.
Étant donné que Weibo par défaut est 302, passez à l'interface de connexion pour les utilisateurs qui ne se sont pas connectés, Weibo est collecté Qian doit faire penser à Weibo que cette collection était trop paresseuse. Ils se sont directement connectés manuellement, puis ont enregistré le cookie dans scrapy. Lors de la demande, apportez le cookie pour y accéder, car le volume de la collecte n'est pas très important, il est estimé qu'il n'est que de 100 000. articles à propos. Ici, je dois rappeler à ceux qui sont nouveaux dans Scrapy que les cookies de Scrapy se présentent sous une forme similaire à JSON. Ce n'est pas comme les coller directement sur les requêtes et les utiliser.
C'est probablement comme ça, vous devez donc coller le cookie après vous être connecté et le convertir avec le code. Le code est le suivant :
class transCookie: def __init__(self, cookie): self.cookie = cookie def stringToDict(self): itemDict = {} items = self.cookie.split(';') for item in items: key = item.split('=')[0].replace(' ', '') value = item.split('=')[1] itemDict[key] = value return itemDict if __name__ == "__main__": cookie = "你的cookie" trans = transCookie(cookie) print(trans.stringToDict())
Je pense qu'un cookie est presque. Cela suffit. Trois cookies sont enregistrés. Le moyen simple de sauvegarder plusieurs cookies est de placer plusieurs cookies directement dans un tableau et d'utiliser la fonction aléatoire pour en sélectionner un au hasard à chaque fois qu'une demande est faite. Bien sûr, cela ne concerne que la situation. lorsqu'un lot de données est collecté puis retiré, un pool de comptes doit être maintenu à grande échelle. Apportez un cookie et un cookie lors de la demande. Comme suit :
Weibo distingue chaque utilisateur en fonction de son oid. Prenons l'exemple de Weibo de Daniel Wu. Recherchez Daniel Wu sur l'interface de recherche de Weibo, faites un clic droit sur la page d'accueil pour afficher la source de la page Web. code. On peut voir :
L'oid ici est l'identifiant unique de chaque utilisateur. L'adresse de la page d'accueil de l'utilisateur correspondant est https://weibo.com + oid
Avec l'adresse, nous pouvons entrer directement dans l'interface Weibo pour la collecter et reconstituer l'adresse url, par exemple :
https://. weibo .com/wuyanzu?is_all=1&stat_date=201712#feedtop
Voici le Weibo de Wu Yanzu en décembre 2017. Nous pouvons facilement constater que le simple fait de changer le numéro après stat_date est l'adresse Weibo correspondante. Pour certains utilisateurs disposant d'une grande quantité de Weibo, le Weibo mensuel peut impliquer de charger à nouveau JS. Bien sûr, notre dieu masculin cool, M. Wu Yanzu, ne publiera certainement pas autant. Trouvons un autre Weibo à comparer. tels que :
, vous pouvez voir que le Weibo restant doit être présenté aux utilisateurs via le chargement asynchrone js. Ouvrez le mode développeur du navigateur,
En comparant deux fois les pages chargées avec js, nous pouvons facilement constater que la différence entre Request_URL est uniquement dans la barre de page et _rnd En termes de paramètres, le premier représente le nombre de pages et le second est le cryptage du temps (cela n'a pas d'importance si vous ne l'utilisez pas pour tester), il nous suffit donc de construire le nombre de pages. Certaines publications Weibo avec un volume énorme devront peut-être encore être retournées. La raison est la même.
class SpiderItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() nickname = scrapy.Field() follow = scrapy.Field() fan = scrapy.Field() weibo_count = scrapy.Field() authentication = scrapy.Field() address = scrapy.Field() graduated = scrapy.Field() date = scrapy.Field() content = scrapy.Field() oid = scrapy.Field()
设置需要爬取的字段nickname昵称,follow关注,fan粉丝,weibo_count微博数量,authentication认证信息,address地址,graduated毕业院校,有些微博不显示的默认设置为空,以及oid和博文内容及发布时间。
这里说一下内容的解析,还是吴彦祖微博,如果我们还是像之前一样直接用scrapy的解析规则去用xpath或者css选择器解析会发现明明结构找的正确却匹配不出数据,这就是微博坑的地方,点开源代码。我们发现:
微博的主题内容全是用script包裹起来的!!!这个问题当初也是困扰了博主很久,反复换着法子用css和xpath解析始终不出数据。
解决办法:正则匹配(无奈但有效)
至此,就可以愉快的进行采集了,附上运行截图:
输入导入mongodb:
相关教程:Python视频教程
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!