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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
总结
对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)
Java面试精选题、架构实战文档
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
结
对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)
[外链图片转存中…(img-ZdLXgOhn-1712805144422)]
Java面试精选题、架构实战文档
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-PFhAhrFR-1712805144422)]