鱼C论坛

 找回密码
 立即注册
查看: 1300|回复: 14

[已解决]爬虫大神快来围观,菜鸟又遇到进阶问题了

[复制链接]
发表于 2020-8-4 10:34:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 L嘉 于 2020-8-4 11:20 编辑

现在我只能爬到标题这些,但是我要爬取子页面的内容应该怎么写了呢?如下图,我要爬取子页面的栋数和户数,但是我这个写好的代码爬取没有反应怎么一回事啊


代码在最后

1415444.png 2424234.jpg 1212121212.jpg

# -*- coding: utf-8 -*-
"""
Created on Tue Aug  4 09:24:02 2020

@author: Administrator
"""

from lxml import etree
import requests
import csv
from multiprocessing.dummy import Pool as pl    #导入线程池

def towrite(item):
    with open('balk.csv','a',encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        try:
            writer.writerow(item)
        except:
            print('write error!')
            
            
def spider(url):
    htm = requests.get(url, headers = headers)
    response=etree.HTML(htm.text)
    
    mingcheng = response.xpath('div[1]/div[1]/a/text()')[0]
    
    zaishou = response.xpath('div[2]/div[2]/a/span/text()')[0]
    
    junjia = response.xpath('div[2]/div[1]/div[1]/span/text()')[0]
    
    dongshu = response.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[3]/div[5]/span[2]/text()')[0]
    
    hushu = response.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[3]/div[6]/span[2]/text()')[0]
    
    xiaoqu_item = [mingcheng,zaishou,junjia,dongshu,hushu]
    towrite(xiaoqu_item)
    print('正在爬取小区:',mingcheng)
    
    
    if __name__ == '__main__':
       headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.3'}
    
    start_url = 'https://cd.ke.com/xiaoqu/damian/pg'
    pool=pl(4)
    all_url = []
    for x in range(1,4):
        html = requests.get(start_url +str(x), headers=headers)
        slector = etree.HTML(html.text)
        xiaoqulist = slector.xpath('//*[@id="beike"]/div[1]/div[4]/div[1]/div[3]/ul/li')
        for xiaoqu in xiaoqulist:
            xiaoqu_url_houduan = xiaoqu.xpath('//*[@id="beike"]/div[1]/div[4]/div[1]/div[3]/ul/li[1]/div[1]/div[1]/a')[0]
            all_url.append(xiaoqu_url_houduan)
    pool.map(spider,all_url)
    pool.close()
    pool.join()
最佳答案
2020-8-4 20:58:18


帮你改完了,应该能达到你的目的了:

6.png
# -*- coding: utf-8 -*-
"""
Created on Tue Aug  4 09:24:02 2020

@author: Administrator
"""

from lxml import etree
import requests
import csv
from multiprocessing.dummy import Pool as pl  # 导入线程池


def towrite(item):
    with open('balk.csv', 'a', encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        try:
            writer.writerow(item)
        except:
            print('write error!')


def spider(url):
    htm = requests.get(url, headers=headers)
    response = etree.HTML(htm.text)

    mingcheng = response.xpath('//div[@class="title"]/h1/text()')[0].strip()

    dongshu = response.xpath('//span[@class="xiaoquInfoContent"]/text()')[4]

    hushu = response.xpath('//span[@class="xiaoquInfoContent"]/text()')[5]

    for i in xiaoquname:
        if mingcheng in i[0]:
            idx = i[0].index(mingcheng)
            zaishou = i[1][idx][0]
            junjia = i[1][idx][1]
            break

    xiaoqu_item = [mingcheng, zaishou,junjia,dongshu, hushu]
    towrite(xiaoqu_item)
    print('正在爬取小区:', mingcheng)


if __name__ == '__main__':
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.3'}

    start_url = 'https://cd.ke.com/xiaoqu/damian/pg'
    pool = pl(4)
    all_url = []
    xiaoquname = []
    for x in range(1, 4):
        html = requests.get(start_url + str(x), headers=headers)
        slector = etree.HTML(html.text)
        xiaoqulist = slector.xpath('//div[@class="info"]/div[@class="title"]/a/@href')
        name = slector.xpath("//a[@class='maidian-detail']/text()")
        jiage = slector.xpath("//div[@class='totalPrice']/span/text()")
        zaishous = slector.xpath("//a[@class='totalSellCount']/span/text()")
        xiaoquname.append([name, list(zip(zaishous,jiage))])
        for xiaoqu in xiaoqulist:
            all_url.append(xiaoqu)
    pool.map(spider, all_url)
    pool.close()
    pool.join()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-4 10:53:12 | 显示全部楼层
用代码编辑器传上来,复制的可能格式不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 11:05:11 | 显示全部楼层
在 spider 函数里
global headers
要把 headers 变成全局变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 11:20:33 | 显示全部楼层
1q23w31 发表于 2020-8-4 10:53
用代码编辑器传上来,复制的可能格式不对

好的,你在帮忙看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 11:22:32 | 显示全部楼层
liuzhengyuan 发表于 2020-8-4 11:05
在 spider 函数里

要把 headers 变成全局变量

还是没反应,空的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 12:20:37 | 显示全部楼层
L嘉 发表于 2020-8-4 11:22
还是没反应,空的

你的 xpath 全部都是错误的呀,你要爬取哪些内容

zaishou 是什么

junjia 是什么

dongshu

hushu
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 13:03:05 | 显示全部楼层
Twilight6 发表于 2020-8-4 12:20
你的 xpath 全部都是错误的呀,你要爬取哪些内容

zaishou 是什么

主要是子页面的爬取不会
1112.png 123131.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 14:10:38 | 显示全部楼层
L嘉 发表于 2020-8-4 13:03
主要是子页面的爬取不会

晚点帮你写吧,现在有点事哈~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 14:32:29 | 显示全部楼层
Twilight6 发表于 2020-8-4 14:10
晚点帮你写吧,现在有点事哈~

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 15:01:41 | 显示全部楼层
本帖最后由 johnnyb 于 2020-8-4 15:17 编辑

用我写的规则.. 亲测 没有任何问题.
import requests
from lxml import etree

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}
url = 'https://cd.ke.com/xiaoqu/1611057941003/?fb_expo_id=343036232051900416'
r = requests.get(url=url, headers=headers, timeout=3)

tree = etree.HTML(r.text)
money = tree.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[2]/div/span[1]/text()')[0]
WY = tree.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[3]/div[2]/span[2]/text()')[0].lstrip().rstrip()
WYGS = tree.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[3]/div[3]/span[2]/text()')[0]
KFS = tree.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[3]/div[4]/span[2]/text()')[0]
tag = tree.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[3]/div[5]/span[2]/text()')[0]
tag2 = tree.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[3]/div[6]/span[2]/text()')[0]
print('参考价格:{0}元/平'.format(money))
print('物业费:{0}'.format(WY))
print('物业公司:{0}'.format(WYGS))
print('开发商:{0}'.format(KFS))
print('楼栋总数:{0}'.format(tag))
print('房屋总数:{0}'.format(tag2))
参考价格:17235元/平
物业费:1.29至5.2元/平米/月
物业公司:成都安达祥和置业有限公司
开发商:成都志达房地产开发有限公司
楼栋总数:69栋
房屋总数:5067户
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-4 17:16:36 | 显示全部楼层
johnnyb 发表于 2020-8-4 15:01
用我写的规则.. 亲测 没有任何问题.

那我要爬取每个小区的呢怎么写呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 17:26:19 | 显示全部楼层
本帖最后由 1q23w31 于 2020-8-4 17:37 编辑
L嘉 发表于 2020-8-4 17:16
那我要爬取每个小区的呢怎么写呢

# -*- coding: utf-8 -*-
"""
Created on Tue Aug  4 09:24:02 2020

@author: Administrator
"""

from lxml import etree
import requests
import csv
from multiprocessing.dummy import Pool as pl    #导入线程池

def towrite(item):
    with open('balk.csv','a') as csvfile:
        writer = csv.writer(csvfile)
        try:
            writer.writerow(item)
        except:
            print('write error!')
            
            
def spider(url):
    htm = requests.get(url, headers = headers)
    response=etree.HTML(htm.text)
    
    mingcheng = response.xpath('//*[@id="beike"]/div[1]/div[2]/div[2]/div/div/div[1]/h1/@title')
    
    
    junjia = response.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[2]/div/span[1]/text()')

    dongshu = response.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[3]/div[5]/span[2]/text()')
    
    hushu = response.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[3]/div[6]/span[2]/text()')
    
    xiaoqu_item = [mingcheng,junjia,dongshu,hushu]
    towrite(xiaoqu_item)
    print('正在爬取小区:',mingcheng)
    
    
if __name__ == '__main__':
   headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.3'}

start_url = 'https://cd.ke.com/xiaoqu/damian/pg'
pool=pl(4)
all_url = []
zaishou = []
for x in range(1,4):
    html = requests.get(start_url +str(x), headers=headers)
    slector = etree.HTML(html.text)
    xiaoqulist = slector.xpath('//*[@id="beike"]/div[1]/div[4]/div[1]/div[3]/ul')


    for xiaoqu in xiaoqulist:
        xiaoqu_url_houduan = xiaoqu.xpath('//*[@id="beike"]/div[1]/div[4]/div[1]/div[3]/ul/li/a/@href')
        price = xiaoqu.xpath('//*[@id="beike"]/div[1]/div[4]/div[1]/div[3]/ul/li/div[2]/div[2]/a/span/text()')
        all_url.extend(xiaoqu_url_houduan)
        zaishou.extend(price)

pool.map(spider,all_url)
pool.close()
pool.join()
不是很完美,除了在售,其他的都能写出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 18:17:42 | 显示全部楼层
本帖最后由 1q23w31 于 2020-8-4 18:20 编辑
L嘉 发表于 2020-8-4 17:16
那我要爬取每个小区的呢怎么写呢

# -*- coding: utf-8 -*-
"""
Created on Tue Aug  4 09:24:02 2020

@author: Administrator
"""

from lxml import etree
import requests
import csv
from multiprocessing.dummy import Pool as pl #导入线程池
import re

def towrite(item):
    with open('balk.csv','a') as csvfile:
        writer = csv.writer(csvfile)
        try:
            writer.writerow(item)
        except:
            print('write error!')
            
            
def spider(url):
    htm = requests.get(url, headers = headers)
    response=etree.HTML(htm.text)
    
    mingcheng = response.xpath('//*[@id="beike"]/div[1]/div[2]/div[2]/div/div/div[1]/h1/@title')
    
    zaishou = response.xpath('/html/head/meta[9]/@content')
    zaishou = re.findall('在售二手房源.*?套',zaishou[0])

    junjia = response.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[2]/div/span[1]/text()')

    dongshu = response.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[3]/div[5]/span[2]/text()')
    
    hushu = response.xpath('//*[@id="beike"]/div[1]/div[3]/div[1]/div[2]/div[3]/div[6]/span[2]/text()')
    
    xiaoqu_item = [mingcheng,zaishou,junjia,dongshu,hushu]
    towrite(xiaoqu_item)
    print('正在爬取小区:',mingcheng)
    
    
if __name__ == '__main__':
   headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.3'}

start_url = 'https://cd.ke.com/xiaoqu/damian/pg'
pool=pl(4)
all_url = []

for x in range(1,4):
    html = requests.get(start_url +str(x), headers=headers)
    slector = etree.HTML(html.text)
    xiaoqulist = slector.xpath('//*[@id="beike"]/div[1]/div[4]/div[1]/div[3]/ul')


    for xiaoqu in xiaoqulist:
        xiaoqu_url_houduan = xiaoqu.xpath('//*[@id="beike"]/div[1]/div[4]/div[1]/div[3]/ul/li/a/@href')
        price = xiaoqu.xpath('//*[@id="beike"]/div[1]/div[4]/div[1]/div[3]/ul/li/div[2]/div[2]/a/span/text()')
        all_url.extend(xiaoqu_url_houduan)


pool.map(spider,all_url)
pool.close()
pool.join()


                               
登录/注册后可看大图


完美解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-4 19:45:21 | 显示全部楼层
L嘉 发表于 2020-8-4 17:16
那我要爬取每个小区的呢怎么写呢

哥们你不是来做伸手党的. 要举一反三.  都给你写完了 你还能学到啥?   再说你都会用Pool了 xpath规则还不明白呢?  不会吧.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

发表于 2020-8-4 20:58:18 | 显示全部楼层    本楼为最佳答案   


帮你改完了,应该能达到你的目的了:

6.png
# -*- coding: utf-8 -*-
"""
Created on Tue Aug  4 09:24:02 2020

@author: Administrator
"""

from lxml import etree
import requests
import csv
from multiprocessing.dummy import Pool as pl  # 导入线程池


def towrite(item):
    with open('balk.csv', 'a', encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        try:
            writer.writerow(item)
        except:
            print('write error!')


def spider(url):
    htm = requests.get(url, headers=headers)
    response = etree.HTML(htm.text)

    mingcheng = response.xpath('//div[@class="title"]/h1/text()')[0].strip()

    dongshu = response.xpath('//span[@class="xiaoquInfoContent"]/text()')[4]

    hushu = response.xpath('//span[@class="xiaoquInfoContent"]/text()')[5]

    for i in xiaoquname:
        if mingcheng in i[0]:
            idx = i[0].index(mingcheng)
            zaishou = i[1][idx][0]
            junjia = i[1][idx][1]
            break

    xiaoqu_item = [mingcheng, zaishou,junjia,dongshu, hushu]
    towrite(xiaoqu_item)
    print('正在爬取小区:', mingcheng)


if __name__ == '__main__':
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.3'}

    start_url = 'https://cd.ke.com/xiaoqu/damian/pg'
    pool = pl(4)
    all_url = []
    xiaoquname = []
    for x in range(1, 4):
        html = requests.get(start_url + str(x), headers=headers)
        slector = etree.HTML(html.text)
        xiaoqulist = slector.xpath('//div[@class="info"]/div[@class="title"]/a/@href')
        name = slector.xpath("//a[@class='maidian-detail']/text()")
        jiage = slector.xpath("//div[@class='totalPrice']/span/text()")
        zaishous = slector.xpath("//a[@class='totalSellCount']/span/text()")
        xiaoquname.append([name, list(zip(zaishous,jiage))])
        for xiaoqu in xiaoqulist:
            all_url.append(xiaoqu)
    pool.map(spider, all_url)
    pool.close()
    pool.join()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 14:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表