学习pyquery后写的一个简单的爬虫代码
from pyquery import PyQuery as pq
import requests
import random
url = "https://nc.newhouse.fang.com/house/s/b91/?ctm=1.nc.xf_search.page.1"
h_list = [
{"User-Agent":"Mozilla/5.0"},
{"User-Agent":"Mozilla/4.0"},
{"User-Agent":"Mozilla/3.0"},
]
headers = random.choice(h_list)
res = requests.get(url,headers=headers)
print(res.status_code)
res.encoding = 'gb2312'
doc = pq(res.text)
#doc = pq(url,encoding='gb2312')
html = doc('ul .nlc_details')
for item in html.items():
name = item.find('.nlcd_name a').text()
commits = item.find('.value_num').text()
size = item.find('.house_type').text()
address = item.find('.address').text()
price = item.find('.nhouse_price').text()
print(name+'\t'+commits+'\t'+size+'\t'+address+'\t'+price)
结果输出为
200
龙湖春江悦茗 (25条评论) 3居/ 4居 - 93~125平米 [新建区] 长富大道777号 11500元/�O
洪大新力合悦滨江 (17条评论) 3居 - 102~128平米 [南昌县] 沿江南大道与东岳大道交汇处 14500元/�O
金茂宸南里 (8条评论) 3居/ 4居 - 89~125平米 [南昌县] 昌南汽车大道 价格待定
华侨城万科世纪水岸 (286条评论) 3居/ 4居 - 89~167平米 [西湖区] 南昌市西湖区云锦路1888号 19000元/�O
联泰滨江中心 (36条评论) 1居 - 49~55平米 [红谷滩区] 赣江南大道与前湖大道交接处 12500元/�O
联发万科西岸春风 (25条评论) 3居/ 4居 - 89~145平米 [红谷滩区] 规划路以西、龙兴大街以北 14300元/�O
联发万科海上明月 (70条评论) 3居/ 4居 - 89~167平米 [高新开发区] 艾溪湖北路与创新二路交汇处 15700元/�O
南昌恒大珑庭・�B庭 (256条评论) 3居/ 4居 - 102~141平米 [南昌县] 振兴大道与澄湖东路交会处 12800元/�O
绿地儒乐星镇 (107条评论) 3居/ 4居 - 100~155平米 [赣江新区] 儒乐湖新城金山大道2333号。 12500元/�O
融创雪个庭 (136条评论) 4居/ 5居 - 125~150平米 [青云谱区] 子真路188号 16000元/�O
鸿海万科天空之城 (450条评论) 3居/ 4居 - 89~125平米 [南昌县] 迎宾中大道与富山五路交汇处(莲塘大润发… 14000元/�O
金地中奥九颂・都会之光 (16条评论) 3居 - 89~109平米 [新建区] 红谷滩西・吾悦广场旁・工业三路与文化… 价格待定
春天里 (16条评论) 3居 - 89~113平米 [新建区] 长征西路与麦山路交汇处 价格待定
中大汇 (13条评论) 3居 - 104~125平米 [青云谱区] 象湖公园东・施尧路与京山南路交汇处 价格待定
蓝城巴夫洛 (15条评论) 2居/ 3居/ 4居 - 84~164平米 中国江西昌西文化产业园迎宾路166号 价格待定
绿地悦滨江 (51条评论) 3居/ 4居 - 100~139平米 [南昌县] 抚生西路 12000元/�O
世茂泰禾江南院子 (44条评论) 4居 - 130~168平米 [南昌县] 迎宾南大道999号翠林南路 230万元/套
南昌恒大林溪府 (348条评论) 3居/ 4居 - 93~200平米 [湾里区] 南昌二十八中湾里校区隔壁 9600元/�O
南昌融创文旅城 (986条评论) 3居 - 125~128平米 [红谷滩区] 南龙蟠街与赣江南大道交汇处 16500元/�O
保利和光 (87条评论) 3居/ 4居 - 95~136平米 [青云谱区] 城南大道与墅溪路交汇处向西300米。 12500元/�O
在进行学习并且多次爬取信息的时候,爬取该网站信息有时会返回ParserError: Document is empty的错误,但是多爬几次还是会有成功的。
另外依然出现有一个字乱码,以及‘㎡’这个字符乱码现象
对上面代码再次改进,爬取多页数据,并并csv格式保存至文件
from pyquery import PyQuery as pq
import requests
import random
import csv
def getText(url,headers,write):
res = requests.get(url,headers=headers)
print(res.status_code)
#res.encoding = 'gb2312'
doc = pq(res.text)
doc = pq(url,encoding='gb2312')
html = doc('ul .nlc_details')
print('正在写入文件。。。')
for item in html.items():
name=item.find('.nlcd_name a').text()
commits=item.find('.value_num').text()
size=item.find('.house_type').text()
address=item.find('.address').text()
price=item.find('.nhouse_price').text()
#print(name+'\t'+commits+'\t'+size+'\t'+address+'\t'+price)
row = (name,address,commits,size,price)
write.writerow(row)
url1 = "https://nc.newhouse.fang.com/house/s/b9"
url2 = "/?ctm=1.nc.xf_search"
h_list = [
{"User-Agent":"Mozilla/5.0"},
{"User-Agent":"Mozilla/4.0"},
{"User-Agent":"Mozilla/3.0"},
]
headers = random.choice(h_list)
fp = open('南昌新房楼盘数据.csv', 'a', newline='',encoding = 'utf-8')
write = csv.writer(fp)
name = '楼盘'
commits = '评论数'
size = '面积'
address = '地址'
price = '价位'
row = (name,address,commits,size,price)
write.writerow(row)
for num in range(1,20):
print("正在爬取第"+str(num)+"页内容。。。")
url = url1 + str(num) + url2
getText(url,headers,write)
fp.close()
运行结果
。。。。。。。
正在爬取第16页内容。。。
200
正在写入文件。。。
正在爬取第17页内容。。。
200
正在写入文件。。。
正在爬取第18页内容。。。
200
正在写入文件。。。
正在爬取第19页内容。。。
200
正在写入文件。。。
最后保存的csv格式文件部分截图如下