Fork me on GitHub

爬虫实战项目-数据爬取

1.首先在爬虫之前我们应该理清楚爬虫的步骤(请求数据——获取数据——解析数据——保存数据)
其中我认为里面复杂一点的就是解析数据,因为不同的数据我们需要的解析方法可能不同,所以也就需要我们选择合适的爬虫解析工具,让我们事半功倍。
解析数据有哪几种呢?
  1.parsel库             import parsel      (这个是我认为最好用的,它是scrapy爬虫框架中独立抽取出来的)
  2.re解析               import re            (正则表达式,解析效率高,但缺点是针对初学者来说相对复杂)
  3.xpath解析         from lxml import etree     (它主要是由一些选择器组成)
  4.beautifulsoup解析       from bs4 import BeautifulSoup   (不建议使用,因为很久没有更新了)

这里我直接贴代码,爬取不同的网页的。

1、爬取汽车之家二手车信息

# 爬取汽车之家的二手车信息

import
requests # 发起请求的库 import parsel              # 解析数据的库   import csv                # python自带的csv保存格式库 for page in range(1, 99): print(f"--------爬取第{page}页-----------") # 这里是一个输出语句,{page}是变量,f是占位符 url = f'https://www.che168.com/beijing/a0_0msdgscncgpi1ltocsp{page}exx0/?pvareaid=102179#currengpostion' # 由于网页翻到第二页,第三页,,只有{page}这个部分在变化,所以这里原本的1,2,3,,,,就是用变量替代,f也是占位符。 headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36', 'referer': 'https://www.che168.com/' # 表示从这里访问的,用于伪装 } response = requests.get(url=url, headers=headers) # 这里发起请求。requests.get()是固定写法,里面包含了url和head,然后将请求到的结果赋值给 response 这个值 html = response.text                     # response.text 就是获得网页的html的标签信息,因为我们想要的数值都包含在这里面。再把这些标签信息赋值给html # print(html)                    # 这里可以打印一下看看有没有成功获取到页面的信息的 selector = parsel.Selector(html)              # 初始化parsel对象,这样我们才能对数据进行解析 lis = selector.css('.viewlist_ul li')           # 因为我们看到网页信息,它里面的车辆信息是包含在一个个的li以内的, viewlist_ul是li上一级ul的的class 这里也就是将所有获取到的li里面的信息赋值给lis for li in lis:                         # 这里使用一个for循环去遍历lis里面的每一个信息 title = li.css('.card-name::text').get()       # 这个.card-name就是标题的名称的class,里面加上一个 ::text 是获取包含的文本内容的,如果不加这个::text,则获取到的是包含里面标签的数据 xinxi = li.css('.cards-unit::text').get()      price = li.css('.pirce em::text').get() # 由于价格信息是包含在一个名为price的class下面的em标签里面的,所以就要加上一个em。 <em>这个标签在html中一般用作强调 yprice = li.css('.cards-price-box s::text').get() # 原价信息包含在class名为.cards-price-box里面的s标签。<s>标签是删除或者定义替换的,如果用在html里面目前一般使用<del>替换 guohu = li.css('.tags-light::text').get() # print(title, xinxi, price, yprice, guohu) # 这里可以通过print打印输出我们爬取到的信息看看有没有成功显示。 with open('汽车之家.csv', mode='a', encoding='utf-8', newline='') as f: # 这个是固定写法的保存的模块,with open() as f: 里面第一个是保存的文件名称,必须要有文件名后缀,第二个是操作文件的模式,a就是追加写入,包括(a,b,r,w)还有a+,w+等等,后面的newline=''是防止保存的时候,每条内容间多一个空格行的 textfile = csv.writer(f) # 这里使用csv的这个.writer()方法将f写入到textfile中 textfile.writerow([title, xinxi, price, yprice, guohu]) # 这里的将前面的textfile使用.writerow()这个方法,一行行的将爬取到的title,xinxi,price,yprice,guohu信息写入到文件里面去 f.close()                        # f.close() 这个是关闭with open()打开的文件的,这里可以不写的,但是一般默认写一下,不然可能会有一些报错。 print('完成!')

2.爬取链家长沙二手房信息

# 爬取长沙链家二手房子的数据

import requests
import parsel
import csv
# 1.发送请求到我们需要的页面 for page in range(1,101): #print(f'********************正在爬取第{page}页数据************************') url = f'https://cs.lianjia.com/ershoufang/pg{page}/' headers = { 'Cookie':'ab_jid=f94bca64d72ad21e03b11024547308748b4d; ab_jid_BFESS=f94bca64d72ad21e03b11024547308748b4d; BDUSS_BFESS=XZiNnktZ3N3dlRWaXdwVjF2RWd3b3BralEya3NZRWtveElBNmhOYWRmbFUxaXBqSVFBQUFBJCQAAAAAAAAAAAEAAAAak1FkNsK30qPC7TkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRJA2NUSQNjN; BAIDUID_BFESS=BE903913D0C54749E0972C4A076BB7F3:FG=1; ZFY=T60X8HS65:BJJ7Lcwah0JUV:BJ:Awp:Bzlneye7cvXl:AYrM:C; ab_bid=12ba05eb98f80c3c5af05c73362e80ff9a0c; ab_sr=1.0.1_NWU3ZWVjZTY2NDQ0ZDk2OThmYjAzY2RlZmVmNTM5MGJjMmI2NmE4N2E1MDJjODA2ZjY0MDFiMzllZGRhYjU3ZTgzYzYxYTJjYmE0ODgzZjM3M2Q0MjdiNzZiYmIxMGMxMGNhYmY3NzIxMDk2NTk1Y2UyYzFmYjBlMWMxZDk3N2YxMDAyYTA1NmY2OTM2NDI3MjY0NjM2YzA2YjkxMzZkOQ==', 'Referer':'https://cs.lianjia.com/', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36' } # 2.获取数据 response = requests.get(url=url,headers=headers) response = response.text # print(response) # 3.解析数据 我们使用parsel就需要转换数据 selectors = parsel.Selector(response) lis = selectors.css('.clear.LOGCLICKDATA') # 获取所有的标签,中间有空格的,所以就用.隔开 for li in lis: title = li.css('.info.clear a::text').get() # 这里的标签实际为 .info clear 但由于中间有空格,所以这里的空格用.替代 area = li.css('.flood a::text').getall() area = '-'.join(area) # 这里将-连接到area里面去,形成一个新的,再赋给area information = li.css('.houseInfo::text').getall() # 一般有多个div的盒子的时候,取最下面的div guanzhu = li.css('.followInfo::text').getall() tags = li.css('.tag span::text').getall() price = li.css('.priceInfo span::text').get()+"" danjia = li.css('.unitPrice span::text').get() print([title],[area],[information],[guanzhu],[tags],[price],[danjia]) # 4.保存数据 with open('./txt/长沙二手房信息.csv', mode='a', encoding='gbk') as f: # mode有三种 a:追加 w:覆盖 r:只读 csv_text = csv.writer(f) csv_text.writerow((title, area, information, guanzhu, tags, price, danjia)) # writerow是一行一行的保存数据,里面是列表或者元组 print("爬取完成!")

 

 

posted @ 2022-09-21 09:58  小百天  阅读(714)  评论(0编辑  收藏  举报