山东大学暑期实训-饮食健康管理系统设计与实现(十)
关于用户信息的爬虫
本篇文章叙述关于用户信息的爬虫代码以及对代码的一些说明。
代码实现
items.py
这个类代表着我们在爬取过程中交互的数据单元。里面的每个字段都是我们要获取或者使用的信息。
import scrapy
class OtherinfoItem(scrapy.Item):
# 用户id
user_id = scrapy.Field()
# 用户昵称
user_name = scrapy.Field()
# 用户头像地址
user_tou_url = scrapy.Field()
# 用户性别
user_sex = scrapy.Field()
# 用户加入时间
user_res_time = scrapy.Field()
info.py
这是我们主要的爬虫类,在这里产生对特定网址的请求,同时接受响应并解析提取内容,送到管道中去。
import scrapy
import os
import csv
from otherinfo.items import OtherinfoItem
from scrapy.utils.project import get_project_settings
class InfoSpider(scrapy.Spider):
name = 'info'
allowed_domains = ['meishichina.com/']
start_urls = ['https://www.meishichina.com//']
def parse(self, response):
# 同时开两个管道
yield scrapy.Request(url='https://www.meishichina.com//', callback=self.get_user_info, dont_filter=True)
# 只开图像管道
# yield scrapy.Request(url='https://www.meishichina.com//', callback=self.supplement_tou, dont_filter=True)
# 只开用户管道
# yield scrapy.Request(url='https://www.meishichina.com//', callback=self.supplement_user, dont_filter=True)
# 对比表user和表4中的id,爬取没有被爬取的
def get_user_info(self, response):
with open(get_project_settings().get("USER_TARGET_PATH"), 'r', encoding='utf-8') as f:
reader = csv.reader(f)
user_target = list(reader)
with open(get_project_settings().get("USER_DONE_PATH"), 'r', encoding='utf-8') as f:
reader = csv.reader(f)
user_done = list(reader)
tmp = {
}
for t in user_target:
tmp[t[0]] = t[1]
for d in user_done:
tmp[d[0]] = 0
for k, v in tmp.items():
if v != 0:
yield scrapy.Request(url=v, meta={
'user_id': k}, callback=self.crawl_user_info, dont_filter=True)
def crawl_user_info(self, response):
item = OtherinfoItem()
# 用户id
user_id = response.meta['user_id']
item['user_id'] = user_id
# 用户昵称
user_name = response.xpath('//div[@class="subname"]//em/a/text()').extract()[0]
item['user_name'] = user_name
# 用户头像地址
user_tou_url = response.xpath('//div[@class="pic"]//img/@src').extract()
item['user_tou_url'] = user_tou_url
sex_class = response.xpath('//div[@class="subname"]/i[1]/@class').extract()[0