scrapy分页抓取网页(怎么去爬取这些数据?一个站点:“”)

优采云 发布时间: 2021-11-10 14:12

  scrapy分页抓取网页(怎么去爬取这些数据?一个站点:“”)

  微博关键词爬虫;超详细的爬虫教程;整个爬虫编写过程和思路;Xpath 表达式编写;数据存储和处理

  我们都知道,一般来说,要爬取微博的相关信息,不如爬取本站的一些内容。但是这个网站没有关键词搜索,所以无法根据我们要搜索的关键词抓取到我们想要的内容。然而,博主发现微博有一个站点:“”。这是一个专门用于检索基于关键词的相关微博的站点。下面,我将使用scrapy抓取本站相关微博,为大家详细讲解过程。

  可以爬取的字段

  先展示那些可以爬取的字段:

  

  如何分析数据是你自己的事情。下面我们详细介绍一下如何抓取这些数据。

  一、网页分析

  首先我们进入,输入我们要搜索的内容,F12怎么按,观察网页格式。

  

  

  为了从网页中提取我们想要的内容,我们选择使用xpath来获取。在scrapy中还有一个.xpath()方法,方便我们写爬虫。这里教大家一个小技巧,我们可以右击我们想要的标签,如何选择复制xpath,可以复制标签的xpath表达式,如何按住Ctrl+F,把复制的表达式放到搜索框中,那么我们后面就可以直接修改表达式,提取出标签下或者与标签同级的标签下的对应内容。这一步很重要,可以提高我们后面写代码的效率。

  

  比如我们这里复制了页面第一个内容的xpath表达式,然后我修改了表达式来提取相似的标签。

  

  如您所见,这种类型有 22 个标签。我数了数。这个页面下只有22条微博。然后,我们只需要在这个 xpath 表达式后面添加内容就可以进一步提取我们想要的字段。. 我们以微博的文字内容为例。

  首先,我们先选择中微博的文字内容:

  

  然后检查标签

  

  此时,我们只需要提取 p 标签的文本即可。首先,我们需要定位到p标签,在刚才的xpath表达式后面加上:“//p[@node-type="feed_list_content"”,所以我们选择这个页面下所有微博的文字内容是现在。其他领域也是如此。我们把所有字段的xpath表达式搞清楚,后面爬的时候具体处理一下。

  

  二、爬虫部分

  对于爬虫部分,我们使用scrapy框架来编写。这个框架的安装以及如何创建项目我就不详细介绍了。您可以自行查找信息。

  创建项目并制作蜘蛛后,我们首先编写item.py,在item中定义我们要爬取的字段。

  from scrapy import Item, Field

class KeywordItem(Item):

"""

关键词微博

"""

keyword = Field()

weibo_url = Field()

content = Field()

weibo_id = Field()

crawl_time = Field()

created_at = Field()

tool = Field()

repost_num = Field()

comment_num = Field()

like_num = Field()

user_url = Field()

user_id = Field()

  然后编写pipeline.py 将爬虫存储在本地数据库中。

  import pymongo

from pymongo.errors import DuplicateKeyError

from settings import MONGO_HOST, MONGO_PORT

class MongoDBPipeline(object):

def __init__(self):

client = pymongo.MongoClient(MONGO_HOST, MONGO_PORT)

db = client['edg']

self.Keyword = db["Keyword"]

def process_item(self, item, spider):

self.insert_item(self.Keyword, item)

@staticmethod

def insert_item(collection, item):

try:

collection.insert(dict(item))

except DuplicateKeyError:

pass

  首先是初始化函数,定义了数据库的端口、名称和表名;然后 process_item 函数将所有项目字段插入到表 Keyword 中。item是scrapy的一大特色,类似于字典的数据结构,爬虫部分将爬取到的数据存储在item中,提交到pipeline进行存储。

  然后我们开始写爬虫部分,在spider文件夹下创建keyword.py,在start_requests中定义要爬取的网页和headers。

   def start_requests(self):

headers = {

'Host': 's.weibo.com',

'Cookie': ''

}

keywords = ['edg']

url = 'https://s.weibo.com/weibo?q={}&Refer=index&page=1'

  那么我们一定要抓取数据,不能只抓取一页的数据。根据网站的URL我们可以发现有一个page参数。我们只需要构造这个参数的值就可以为不同的页面生成URL。,我把他放到一个URL列表中,迭代访问。

  urls = []

for keyword in keywords:

urls.append(url.format(keyword))

for url in urls:

yield Request(url, callback=self.parse,headers=headers)

  然后我们编写爬虫处理函数parse。

   def parse(self, response):

if response.url.endswith('page=1'):

page = 50

for page_num in range(2, page+1):

page_url = response.url.replace('page=1', 'page={}'.format(page_num))

yield Request(page_url, self.parse, dont_filter=True, meta=response.meta)

if response.status == 200:

html_result = response.text

data = etree.HTML(html_result)

nodes = data.xpath('//div[@class="card"]')

  首先是判断url的最后一个page参数是否为1,如果是,那么我们把页面复制到50(因为网站最多可以显示50页的微博内容),然后使用format 方法构造 50 个 URL,每个都提交给 parse 方法进行处理。

  如果访问成功,所有“//div[@class="card"]”将被提取并分配给节点。这是我们上面的网络分析提取的所有收录微博内容的 xpath 表达式。然后它提取节点循环中的所有文本内容。

  这里我们仅以提取微博文本内容为例

  你只需要将提取的微博文本内容的xpath表达式提取到"//div[@class="card"]"之后添加到内容中,处理后放入keyword_item中(我刚才说的类似字典结构,用法同字典)。如何处理它提取所有文本?这需要不断的实验。例如,在我意识到我使用的是 .xpath('string(.)') 之前,我尝试了很多次。最后别忘了提交给项目。

  extract_weibo_content() 是处理和提取文本中多余的表情符号、符号和 URL 的函数。代码显示如下:

  def extract_weibo_content(weibo_html):

s = weibo_html

if 'class="ctt">' in s:

s = s.split('class="ctt">', maxsplit=1)[1]

s = emoji_re.sub('', s)

s = url_re.sub('', s)

s = div_re.sub('', s)

s = image_re.sub('', s)

if '' in s:

s = s.split('')[0]

splits = s.split('赞[')

if len(splits) == 2:

s = splits[0]

if len(splits) == 3:

origin_text = splits[0]

retweet_text = splits[1].split('转发理由:')[1]

s = origin_text + '转发理由:' + retweet_text

s = white_space_re.sub(' ', s)

s = keyword_re.sub('', s)

s = s.replace('\xa0', '')

s = s.strip(':')

s = s.strip()

return s

  三、数据抓取与处理

  然后我们就可以开始运行爬虫了。

  

  可以看出爬虫运行没有问题。我用一个ip和一个账号来爬取。经测试,速度约为每小时10000次爬行。

  最后查看我们在mongodb中爬取的数据,我也爬取了微博上的评论

  

  这里的数据量有点小,主要是我过了一会儿就停了。如果你想爬得更多,你可以自己尝试一下。

  有了数据,接下来我们要怎么分析,至少我们还有饭要煮。微博和评论的词云在这里产生

  

  

  我也是爬虫爱好者,希望写这篇文章可以帮助到一些刚入门的人。欢迎大家交流批评指正。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线