python爬取,响应状态正确,但是解析不出内容

爬取的是58同城租房信息,执行程序后,只是光标在闪烁,长时间不显示结果。由于状态码为200,所以考虑正则表达式是否合理。由于网页源代码中有大量的换行符,一开始匹配用的是[\s\S]*?,并没有考虑所要获取的内容基本都是独一行,所以精简后的正则在获取内容时用(.*?)。再次执行程序,结果就出来了。

本人初学爬虫,如有更好的解决方法,欢迎评论交流!

原来的正则表达式为:

pat = r'<li[\s\S]*?<img[\s\S]*?lazy_src="([\s\S]*?)"[\s]*?src="[\s\S]*?">[\s\S]*?rel="nofollow" >([\s\S]*?)</a>[\s\S]*?room strongbox">([\s\S]*?)&nbsp;&nbsp;&nbsp;&nbsp;([\s\S]*?)</p>[\s\S]*?<b class="strongbox">([\s\S]*?)</b>[\s\S]*?</li>'      

精简后的表达式为:

pat = r'<li[\s\S]*?_src="(.*?)"[\s\S]*?_blank".*?\n([\s\S]*?)</a[\s\S]*?x">(.*?)&nbsp;&nbsp;&nbsp;&nbsp;(.*?)</p[\s\S]*?x">([\d]*?)</b'

完整程序;

import requests
from requests.exceptions import RequestException
import re,json,os

def getpage(num):
    '''获取指定页面信息'''
    url = 'https://bj.58.com/chuzu/pn'+str(num)+'/?ClickID=2'
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36"
    }
    try:
        res = requests.get(url,headers=headers)
        if res.status_code == 200:
            #获取数据
            html = res.content.decode('utf-8')
            #获取整页数据太慢,只其中的部分数据
            html2 = html[25050:45050]
            #解析数据
            # pat = r'<li[\s\S]*?<img[\s\S]*?lazy_src="([\s\S]*?)"[\s]*?src="[\s\S]*?">[\s\S]*?rel="nofollow" >([\s\S]*?)</a>[\s\S]*?room strongbox">([\s\S]*?)&nbsp;&nbsp;&nbsp;&nbsp;([\s\S]*?)</p>[\s\S]*?<b class="strongbox">([\s\S]*?)</b>[\s\S]*?</li>'
            #精简后的re表达式
            pat = r'<li[\s\S]*?_src="(.*?)"[\s\S]*?_blank".*?\n([\s\S]*?)</a[\s\S]*?x">(.*?)&nbsp;&nbsp;&nbsp;&nbsp;(.*?)</p[\s\S]*?x">([\d]*?)</b'
            dlist = re.findall(pat,html,re.M)
            x =int(str(num)+'01')
            for item in dlist:
                yield{
                    ' | 标题:':item[1].strip(),
                    ' | 户型:':item[2].strip()+','+item[3].strip(),
                    ' | 价格:':item[4]+'元/月',
                    ' | 图片:':item[0],
                }
                #获取图片
                img = requests.get('https:'+item[0])
                with open('./images/req%s.jpg' % x,'wb') as f:
                    f.write(img.content)
                    f.close()
                x+=1
                # print('标题:'+item[1].strip()+' | 户型:'+item[2].strip()+','+item[3].strip()+' | 价格:'+item[4]+'元/月')
            print("共"+str(len(dlist))+"条数据")
        else:
            print('网页爬取错误1')
            return None
    except RequestException as e:
        print(e)
        return None

def writeFile(content):
    '''将获取的信息写入文件'''
    with open('./58req.txt','a',encoding='utf-8') as f:
        f.write(json.dumps(content,ensure_ascii=False) + "\n")

def main(num):
    '''主函数'''
    #判断当前路径是否存在images文件夹,没有则创建
    if not os.path.exists('./images'):
        os.mkdir('./images')
    for item in getpage(num):
        writeFile(item)

if __name__ == '__main__':
    num = int(input('请输入你要查看的页面(1-70):'))
    main(num)

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬取58同城二手车信息的一般步骤如下: 1. 对58同城二手车页面进行分析,找出需要爬取的信息所在的HTML标签和属性; 2. 使用Python爬虫框架(如Scrapy或BeautifulSoup)编写爬虫程序,模拟浏览器向58同城服务器发送请求,并获取服务器返回的HTML页面; 3. 解析HTML页面,提取需要的二手车信息,并存储到本地的数据库或文件中。 以下是一个简单的Scrapy爬虫程序示例,可以爬取58同城二手车信息: ```python import scrapy class SecondHandCarSpider(scrapy.Spider): name = "second_hand_car" start_urls = [ 'https://bj.58.com/ershouche/', ] def parse(self, response): for car in response.css('ul.carlist li'): yield { 'title': car.css('h2 a::text').get(), 'price': car.css('.col-1 .priType-s b::text').get(), 'mileage': car.css('.col-1 .kilometer::text').get(), 'year': car.css('.col-1 .carinfo span:first-child::text').get(), 'brand': car.css('.col-1 .carinfo span:nth-child(2)::text').get(), 'model': car.css('.col-1 .carinfo span:nth-child(3)::text').get(), 'location': car.css('.col-2 p:nth-child(1) a::text').get(), 'publish_time': car.css('.col-2 p:nth-child(2)::text').get(), } next_page = response.css('.pager a.next::attr(href)').get() if next_page is not None: yield response.follow(next_page, self.parse) ``` 该程序使用了Scrapy框架,通过CSS选择器提取了每辆二手车的标题、价格、里程、年份、品牌、型号、地点和发布时间等信息,并翻页继续爬取下一页的数据。您可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值