Scrapy+Mysql爬虫 知乎热榜

这是一个scrapy比较初级的练手项目,适合像我这种刚刚入门的小萌新。做完可以收获很多知识,赶快动起小手操练起来吧。
1)首先,创建一个表格用来存放爬取到的数据,共两个字段,id int(2),cont varchar(255),主键为id,注意id要设置为自动递增,这个很重要! 否则会导致数据插不进去的。保存,命名zhihu_hot。

这里用的是navicat2)打开知乎热榜,今天的热榜依旧是那么没有营养呢
网址:https://www.zhihu.com/hot
同时按下:Fn+F12分析下网页,我用的火狐,chrome也差不多。
在这里插入图片描述我需要的信息是热榜内容,也就是存在

<h2 class="HotItem-title">....</h2>

这个标签里面的文字了,(要是这个看不懂,就需要去恶补一下HTML相关知识了),至于是怎么找到这个的,看到查看器左边的那个小箭头了吗,点一下页面的部件后自动找到HTML代码中对应位置。
在接下来的爬虫里面,我们需要提取出该标签里面的文字并存入数据库就大功告成了。但在此之前不要着急写代码,先用在命令行分析一下该网页,调试之后再开工,会大大减少后面的麻烦。
3)进入分析,打开cmd,scrapy shell https://zhihu.com/hot
在这里插入图片描述
看分析结果:
在这里插入图片描述
呵呵,返回400,显然没有分析成功,知乎设置了反爬虫机关,要先伪装成浏览器访问才行。在原语句后面加上一段:-s USER_AGENT="Mozilla/5.0"之后分析成功。
在这里插入图片描述
但是到了这里还没完,后续分析发现,这显然是被挡在门外了啊!这不是登录界面吗?
在这里插入图片描述原来看知乎热榜都需要登录了,没天理 ,这也是为什么很多上古的爬虫代码现在都运行不起来,现在很多网站都要在登录之后才能提供相关的服务。
登录只要提供相关的cookies就可以了,cookies里面包含着你的登录信息,需要找到cookies。
cookies信息比较容易找到,在登录了网站后,打开web控制台,选择“网络”,Fn+F5刷新下网页,找到域名为https://www.zhihu.com/hot的get项目,就可以找到cookies。把找到的cookies保存为一个txt文件(直接复制内容就可以了,不需要调整格式什么的,后面代码会把他们一条条分开的)。
在这里插入图片描述
4)准备工作基本完成,开始编写代码。
在想要创建工程文件的目录下,打开cmd,有个比较方便的方式,就是打开当前目录,按下shift的同时鼠标右键,可以选择直接在当前目录下打开cmd。打开后打开已经安装了scrapy的虚拟环境(我用的anaconda),输入scrapy startproject zhihuSpider,就能创建一个工程文件夹。
在spiders文件夹下创建zhihu.py
该爬虫需要修改编写四个文件:zhihu.py(自己创建的),items.py,settings.py,pipelines.py(这三个本来就有),其中:
zhihu.py 主要定义如何爬取需要的信息
items.py 定义需要爬取的门类
pipelines.py 定义如何处理爬取到的信息
settings.py 一些设置问题

items.py
这个爬虫的目的是爬取知乎热榜的信息,也就是只需要一个容器就够了

hot_topic=scrapy.Field()

起名为:hot_topic,别的地方不需要修改

#items.py
import scrapy

class ZhihuspiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    hot_topic=scrapy.Field()
    pass

zhihu.py
重写start_requests()方法,在Request函数的参数中传递cookies。这里还用到了css选择器response.css('.HotItem-title::text'),注意返回的是list,要转换成str数据类型才能存到item中。

# zhihu.py
import scrapy
from scrapy import Request
from zhihuSpider.items import ZhihuspiderItem


class ZhihuSpider(scrapy.Spider):
    name = "zhihu"
    allowed_domains = ["www.zhihu.com"]

    def start_requests(self):
        url = 'https://www.zhihu.com/hot'
        headers={
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0"
        }
        f=open(r'D:\scrapy\zhihuSpider\zhihuSpider\cookies.txt','r')
        cookies={}
        for line in f.read().split(';'):
            name,value=line.strip().split('=',1)
            cookies[name]=value
        yield Request(url=url,headers=headers,cookies=cookies,callback=self.parse)

    def parse(self, response):
        item=ZhihuspiderItem()
        cont=response.css('.HotItem-title::text').extract()
        for c in cont:
            item['hot_topic'] = str(c)
            yield item

pipeline.py

import pymysql.cursors

class ZhihuspiderPipeline(object):
    def __init__(self):
        self.connect=pymysql.connect(
            host='127.0.0.1',
            port=3306,
            database='scrapymysql',
            user='root',
            password='password',
            charset='utf8'
        )
        self.cursor=self.connect.cursor()

    def process_item(self, item, spider):
        self.cursor.execute(
            """insert into zhihu_hot(tag)
            values(%s)""",(item['hot_topic'])
        )
        self.connect.commit()
        return item

settings.py

BOT_NAME = 'zhihuSpider'

SPIDER_MODULES = ['zhihuSpider.spiders']
NEWSPIDER_MODULE = 'zhihuSpider.spiders'

ITEM_PIPELINES = {
   'zhihuSpider.pipelines.ZhihuspiderPipeline': 300,
}
ROBOTSTXT_OBEY = False

全部编写完成之后,编译下。就可以在cmd(工程项目文件夹下)输入:scrapy crawl zhihu,就可以运行爬虫了。
在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值