简单静态一级页面爬取
爬取汽车之家(泰州)二手车信息
爬取[‘名称’,‘公里数’,‘上牌时间’,‘销售者’,‘价格’]
——————————————开始了———————————————
1.判断是否为静态页面
图中的文字信息出现在源代码中,可以判断为静态页面。
2.分析网址
#第一页地址:https://www.che168.com/tai_zhou/a0_0msdgscncgpi1lto1cspexx0/
#第二页地址:https://www.che168.com/tai_zhou/a0_0msdgscncgpi1lto1csp2exx0/
#第三页地址:https://www.che168.com/tai_zhou/a0_0msdgscncgpi1lto1csp3exx0/
#所以第n页地址:https://www.che168.com/tai_zhou/a0_0msdgscncgpi1lto1csp{}exx0/
3.正则表达式
网页源代码:
<div class="cards-bottom">
<h4 class="card-name">比亚迪F3R 2009款 金钻版 1.5L 舒适型 GL-i</h4>
<p class="cards-unit">11.3万公里/2010-03/泰州/商家</p>
<div class="cards-price-box"><span class="pirce"><em>0.88</em>万</span>
<span class="tags"><i class="tp-tags green" title="车辆过户次数为0">0次过户</i></span>
<s>6.39万</s></div>
<div class="cards-tags-box"></div>
</div>
方法:
(1)相同内容可以保留
(2)无关内容用 .*f 代替
(3)需要的内容用(.*f)代替
所以正则表达式为:
<div class="cards-bottom">.*?<h4 class="card-name">(.*?)</h4>.*?<p class="card.*?">(.*?)</p>.*?<span class="pirce"><em>(.*?)</em>
代码:
#导入
import time
import random
import re
import requests
import csv
#创建类
class CarSpider:
def __init__(self):#初始化
self.url = 'https://www.che168.com/tai_zhou/a0_0msdgscncgpi1lto1csp{}exx0/'
#创建User_Agent池
self.header_list = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50']
self.header = {
'User-Agent':random.choice(self.header_list)}
self.f = open('g:carspider.csv','w',newline='',encoding='gb2312')#csv文件路径文件名,编码方式,每行之间没有空格
self.writer = csv.writer(self.f)
def get_html(self,url): #获取html
html = requests.get(url = url,headers = self.header).content.decode('gb2312', 'ignore')#根据网页源码可以看出是gb2312
return html
def re_func(self,regex,html): #解析网页
pattern = re.compile(regex,re.S)
r_list = pattern.findall(html)
return r_list
def parse_html(self,one_url):#处理网页
#正则表达式
one_regex = '<div class="cards-bottom">.*?<h4 class="card-name">(.*?)</h4>.*?<p class="card.*?">(.*?)</p>.*?<span class="pirce"><em>(.*?)</em>'
one_html = self.get_html(url=one_url)#获取网址
r_list = self.re_func(regex=one_regex,html=one_html)#解析网页
#print(r_list)
self.save_html(r_list)
def save_html(self,r_list):#数据处理
for r in r_list:
# 名称 公里数 上牌时间 销售者 销售价值
li = [r[0].strip(),r[1].split('/')[0].strip(),r[1].split('/')[1].strip(),r[1].split('/')[3].strip(),r[2].strip()+'万']
self.writer.writerow(li)
def run(self):
li = ['名称','公里数','上牌时间','销售者','价格']#csv首行
self.writer.writerow(li)
for offset in range(1,8):
one_url = self.url.format(offset)
self.parse_html(one_url)
time.sleep(random.uniform(0,1))
print('|第{}页爬取成功|'.format(offset))
print('-'*20)
self.f.close#关闭文件
if __name__ == '__main__':
start_time = time.time()
print("|执行开始|")
print('-'*20)
spider = CarSpider()
spider.run()
end_time = time.time()
print('|执行结束|')
print('-'*20)
print('|总共执行时间为:{0:.2f}秒|'.format(end_time-start_time))
执行后:
在g盘下会发现一个csv文件,打开后:
————————————————拉到底了—————————————————