五十四、使用Scrapy爬取北京公交信息(将爬取的数据存入Mysql

        yield FormRequest(url, callback=self.parse_index)



        5、在pycharm中的命令行界面执行 "scrapy crawl bei\_bus" 爬取一级网页,效果如下



进入beijingbus/目录下执行 "scrapy crawl bei\_bus"命令



>   

> ![](https://img-blog.csdnimg.cn/ef62daeae72c4f0e80aab5c47727d5eb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5omY6ams5pavLemFt-a2mw==,size_20,color_FFFFFF,t_70,g_se,x_16)

> 

>         注:scrapy框架爬虫开始执行 



> 一级网页效果:

> 

> ![](https://img-blog.csdnimg.cn/754e056b057f4b8f8e0508f8cc33d362.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5omY6ams5pavLemFt-a2mw==,size_20,color_FFFFFF,t_70,g_se,x_16)



         6、 爬取二级网页



> ```

>     def parse_index(self, reponse):

>         beijing = reponse.xpath('//div[@class="list clearfix"]/a//@href').extract()

>         for c in beijing:

>             url3 = urljoin(self.start_urls, c)

>             yield Request(url3, callback=self.parse_detail)

> ```

> 

>         进入命令行界面执行 "scrapy crawl bei\_bus" 爬取二级网页,效果如图

> 

> ![](https://img-blog.csdnimg.cn/6fb2e4f399c9483e8bee84317eaff381.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5omY6ams5pavLemFt-a2mw==,size_20,color_FFFFFF,t_70,g_se,x_16)

> 

>         注:在parse\_index()方法中,使用Xpath寻找详细信息页面的URL,并对网址进行拼接,之后对二级网页发起请求,并返回回调函数parse\_detail()



        7、爬取页面详细信息



> ```

>   def parse_detail(self, response):

>         #这里只爬取这些字段,可以自行添加

>         a = response.xpath('//h1[@class="title"]/text()').extract_first()

> 

>         b = response.xpath('//a[@class="category"]/text()').extract_first()

> 

>         c = response.xpath('//ul[@class="bus-desc"]/li[1]/text()').extract_first()

>         item = BeijingbusItem()

>         for field in item.fields:

>             item[field] = eval(field)

>         yield item

> ```

> 

> ![](https://img-blog.csdnimg.cn/b25fd097286f43e89a0702ffd24a13e4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5omY6ams5pavLemFt-a2mw==,size_20,color_FFFFFF,t_70,g_se,x_16)



        8、详细信息页面效果



> ![](https://img-blog.csdnimg.cn/7ede6618a1c54f0782384f1ffeec6b25.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5omY6ams5pavLemFt-a2mw==,size_20,color_FFFFFF,t_70,g_se,x_16)

> 

>         注:这将会爬取到list1标签内所有路信息,其中包括公交路线,市区普线,运行时间这些字段,其余字段可以自行添加。



        9、将爬取的内容存入Mysql



> A、在 MySQL 的 studb 数据库中创建一个 businfo 表:

> 

> ```

> create table businfo(

> 	a varchar(1000),

> 	b varchar(1000),

> 	c varchar(1000));

> 

> ```

> 

> B、在 settings.py 文件末尾添加如下参数:

> 

> ```

> DB_HOST = 'localhost'

> DB_USER = 'root'

> DB_PWD = 'dang'

> DB_CHARSET='UTF8'

> DB = 'studb'

> ```

> 

> C、在 pipelines.py 文件中,修改 class 名称为 MySQL Pipeline,添加初始化方法,将 host、user、password、db、charset 从 settings 中读取出来,并通过添加一个connect()方法建立与数据库的连接,代码如下。

> 

> ```

> import pymysql

> from itemadapter import ItemAdapter

> from beijingbus import settings

> 

> class MysqlPipeline(object):

>     def __init__(self):

>         self.host = settings.DB_HOST

>         self.user = settings.DB_USER

>         self.pwd = settings.DB_PWD

>         self.db = settings.DB

>         self.charset = settings.DB_CHARSET

>         self.connect()

> 

>     def connect(self):

>         self.conn = pymysql.connect(host=self.host, user=self.user, password=self.pwd, db=self.db, charset=self.charset)

>         self.cursor = self.conn.cursor()

> 

>     def process_item(self, item, spider):

>         sql = 'INSERT INTO businfo (a,b,c)VALUES("%s","%s","%s")' % (item['a'], item['b'], item['c'])

>         self.cursor.execute(sql)

>         self.conn.commit()

>         return item

> 

>     def close_spider(self, spider):

>         self.conn.close()

>         self.cursor.close()

> ```

> 

>         注:close\_spider()方法,用于关闭 MySQL 数据库连接,process\_item()方法,用于完成向数据库中插入数据的操作

> 

> D、在 settings.py 中将 ITEM\_PIPELINES 方法的注释去掉,并将其中的内容 改为“'beibus.pipelines.MysqlPipeline':300”,后面的数字代表优先级,数字越小, 优先级越高,代码如下:

> 

> ```

> ITEM_PIPELINES = {

>     'beijingbus.pipelines.MysqlPipeline': 300

> }

> ```



        10、在 PyCharm 软件左下角单击“Terminal”标签,进入命令行界面,在其中执行 “scrapy crawl bei\_bus”命令,启动爬虫项目,查看数据库



![](https://img-blog.csdnimg.cn/20de3bdae6d84999b2a5b87cb525d7b5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5omY6ams5pavLemFt-a2mw==,size_20,color_FFFFFF,t_70,g_se,x_16)



程序完整源代码

-------



**bei\_bus.py:**



import scrapy

from scrapy import Spider, Request, FormRequest

from urllib.parse import urljoin

from …items import BeijingbusItem

class BeiBusSpider(scrapy.Spider):

name = 'bei_bus'

allowed_domains = ['beijing.8684.cn']

start_urls = 'http://beijing.8684.cn/'



def start_requests(self):

    for page in range(1):

        url = '{url}/list{page}'.format(url=self.start_urls, page=(page + 1))

        yield FormRequest(url, callback=self.parse_index)



def parse_index(self, reponse):

    beijing = reponse.xpath('//div[@class="list clearfix"]/a//@href').extract()

    for c in beijing:

        urls = urljoin(self.start_urls, c)

        yield Request(urls, callback=self.parse_detail)



def parse_detail(self, response):

    a = response.xpath('//h1[@class="title"]/text()').extract_first()



    b = response.xpath('//a[@class="category"]/text()').extract_first()



    c = response.xpath('//ul[@class="bus-desc"]/li[1]/text()').extract_first()

    # 格式化数据

    ab = BeijingbusItem()

    for field in ab.fields:

        ab[field] = eval(field)

    yield ab



def parse(self, response):

    pass



>         注:当添加其他字段的爬取时也要进行格式化数据,即在items.py中进行格式化,如下



**items.py:**



import scrapy

#格式化数据

class BeijingbusItem(scrapy.Item):

a = scrapy.Field()

b = scrapy.Field()

c = scrapy.Field()



**pipelines.py:**



import pymysql

from itemadapter import ItemAdapter

from beijingbus import settings

class MysqlPipeline(object):

def __init__(self):

    self.host = settings.DB_HOST

    self.user = settings.DB_USER

    self.pwd = settings.DB_PWD

    self.db = settings.DB

    self.charset = settings.DB_CHARSET

    self.connect()

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)

image

Java面试精选题、架构实战文档

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)

[外链图片转存中…(img-ZdLXgOhn-1712805144422)]

Java面试精选题、架构实战文档

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-PFhAhrFR-1712805144422)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值