一、用pycharm创建scrapy项目
- 创建一个pure python项目
- 下载scrapy
选择file—setting——project Interpreter
- 创建项目
选择Terminal窗口,输入命令“scrapy startproject Testscr”这里的Testscr为项目名称
二、项目结构说明
- scrapy.cfg是整个项目的配置文件
- items.py存储的是所有爬取数据的模型
- middlewares.py是中间件
- pipelines.py用于处理爬取到的数据
三、创建结构化实体
- 修改items.py文件
- 添加爬取结果实体
class CityItem(scrapy.Item):
name=scrapy.Field() #项目名称
url=scrapy.Field() #项目对应URL
四、创建爬虫
cd Testscr //Testscr是项目文件夹名称
scrapy genspider hotel bnb.qunar.com
- hotel 是爬虫名称
- bnb.qunar.com 是爬取的域名
- 创建成功后在spiders文件夹中出现hotel.py文件
class HotelSpider(scrapy.Spider):
name = 'hotel' #爬虫的名字
allowed_domains = ['bnb.qunar.com'] #允许的域名
start_urls = ['https://www.jxsggzy.cn/web/jyxx/002006/jyxx.html'] #开始的url
def parse(self, response):
'''
解析html获取所需数据
'''
#爬取下来的html代码
html=response.text
soup = bs4.BeautifulSoup(html) # 通过下载的网页文本创建bs4对象
elems = soup.select("a[class='ewb-list-name']") # 进行页面元素筛选
item=CityItem()
url = "https://www.jxsggzy.cn"
for elem in elems:
item["name"]=elem.getText()
item["url"]=url+ elem.get("href")
yield item #返回信息,存储在结构化实体中
五、修改配置文件
- 修改settings.py文件
- 添加网页头部信息
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36',
}
没有添加网页头部信息,爬虫没有效果
六、进行持久性存储
- 使用Pipeline处理数据
当Item在Spider中被收集之后,它将会被传递到Pipeline,一些组件会按照一定的顺序执行对Item的处理。
Pipeline经常进行一下一些操作:- 清理HTML数据
- 验证爬取的数据(检查item包含某些字段)
- 查重(并丢弃)
- 将爬取结果保存到数据库中
- 注册Pipeline,修改settings.py文件
ITEM_PIPELINES = {
'Testscr.pipelines.TestscrPipeline': 300,
}
上面的代码用于注册Pipeline,其中Testscr.pipelines.TestscrPipeline为你要注册的类,右侧的’300’为该Pipeline的优先级,范围1~1000,越小越先执行。
3. 修改pipelines.py中的TestscrPipeline进行存储结果,这里采用JSON存储
class TestscrPipeline:
def process_item(self, item, spider):
self.exporter.export_item(item)
# 返回item
return item
# 该方法在spider被开启时被调用。
def open_spider(self, spider):
print('start crawling....')
self.file = open('data.json', 'wb')
self.exporter = JsonLinesItemExporter(self.file, ensure_ascii=False)
# 该方法在spider被关闭时被调用。
def close_spider(self, spider):
self.file.close()
print('stop crawling.....')
七、建立运行文件
- 创建一个run.py文件
from scrapy import cmdline
cmdline.execute("scrapy crawl hotel".split())
其中hotel为蜘蛛名称
八、URL翻页跟进,爬取更多页内容
def parse(self, response):
……
for elem in elems:
item["name"]=elem.getText()
item["url"]=url+ elem.get("href")
yield item #返回信息
# url翻页跟进
# 获取下一页的url信息
elem=soup.select("li[class='nextlink'] a")
if len(elem)>0:
page=url+ elem[0].get("href")
print("下一页地址:"+page)
yield scrapy.Request(page, callback=self.parse,dont_filter=True)
- 下一页链接地址
elem=soup.select("li[class='nextlink'] a")
page=url+ elem[0].get("href")
- 接着查询
yield scrapy.Request(page, callback=self.parse,dont_filter=True)
注意:下一个参数必须有,否则不执行,他表示重复页面不进行爬取
dont_filter=True