文章目录
1.蜘蛛侠思路:
赶集网
爬取网站的url地址:点击超链接-----赶集网主页-------
步骤一:开始爬虫的第一步应该是要先明确需要爬取的目标网址,这就需要花一些时间了解网站的大致结构,以及明确自己想要获取的数据,并且需要知道这些数据是通过什么方式展现出来的,这就需要查看网站的源代码,如果网站源代码中没有这些数据,就需要考虑其是否是用ajax等方式发送的。
步骤二:观察切换页码时url地址的规律变化
步骤三:观察详情页url地址的规律变化,编写代码
-点击【切换城市】转到有所有城市的主页
2.构造爬虫及代码解读
你可以通过cmd构建爬虫,也可以直接使用pycharm中自带的终端构建爬虫
#创建爬虫项目
scrapy startproject ganji_crawl
#创建爬虫
scrapy genspider ganji anshan.ganji.com
身为一个蜘蛛侠,首先就是需要猥琐,不能让网站知道你是蜘蛛侠,超人都需要隐藏身份,所以我们先写好
settings.py
文件,把自己伪装成浏览器,让网站不知道我们是蜘蛛侠,然后再写爬虫,以免暴露身份,我把每个文件都分成了单个函数来讲解,这样更方便理解一下,合在一起就是完整的了。
(1)settings.py
爬取一些简单的网站,不需要修改那么多,简单改一下就行了。
LOG_LEVEL='WARNING' #日志的输出等级,不想看那么多日志信息就可以写成WARNING
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'#把自己伪装成浏览器
ROBOTSTXT_OBEY = False #不遵从机器人协议
#把注释去掉就行
ITEM_PIPELINES = {
'erShouFang.pipelines.ErshoufangPipeline': 300,
}
USER_AGENT随便打开一个网站按F12就能找到,不同浏览器的USER_AGENT是不一样的
(2)ganji.py
import scrapy
import re
from ..items import ErshoufangItem
class GanjiSpider(scrapy.Spider):
name = 'ganji' #爬虫名,运行的关键参数
start_urls = ['http://www.ganji.com/index.htm']
def start_requests(self):
for urls in self.start_urls:
yield scrapy.Request(url=urls,callback=self.parse_province)
通过
start_urls
对赶集网主页发起请求。重写start_requests
方法,一般不直接用parse函数,构造一个新函数会更好;这里通过callback回调了一个新的函数parse_province
def parse_province(self,response):
all_city_href = response.xpath('.//div[@class="all-city"]/dl/dd/a/@href').extract()[:1] #300个城市中选前1个
for city_href in all_city_href:
yield scrapy.Request(url=city_href+"zufang",callback=self.parse_detail_urls)
1.定义了一个解析主页所有城市超链接的函数,获取到所有城市的超链接,由于条件有限,这里就只获取第一个url,如果你想一口气干到底,你可以试着把
[:1]
这个限制去掉… 学到这个思路就好
/
2.extract()
返回的是一个列表extract_first()
返回列表第一个元素,get()
返回一个字符串
/
3.all_city_href
获取到的url是不完整,所以还需要拼接一下才能请求到目标网址
/
4.callback
回调函数,通过获取到的url发起新的请求
5.url = http://anshan.ganji.com/zufang/ , zufang=租房,二手房=ershoufang …
通过观察网站,我们发现详情页有我们需要的所有数据,所以这里我直接获取详情页的数据就行了。
我删
def parse_detail_urls(self,response):
print("province_urls:" + response.url)
all_detail_url = response.xpath('.//dd[@class="dd-item title"]/a/@href').extract()
for detail_url in all_detail_url:
if "http" in detail_url:
yield scrapy.Request(url=detail_url,callback=self.parse_detail)
if "http" not in detail_url:
yield scrapy.Request(url="http:"+detail_url,callback=self.parse_detail)
next_url = response.xpath('.//a[@class="next"]/@href').get()
if next_url:
yield scrapy.Request(url=next_url, callback=self.parse_detail_urls)
1.定义一个获取详情页url和实现自动翻页的函数,至于加这个 http 的判断是因为获取的详情页url中有一些是不完整的,所以需要加个判断
2.next_url
获取下一页的url地址,通过callback
回调自己,实现自动翻页,不需要再去看网站有多少一页,再写个循环了…