太阳花田 发表于 2017-6-9 01:13:47

Python 爬虫 正则

import re
import csv
import time
import random
importthreading
import requests
import urllib.request
from bs4 import BeautifulSoup
from urllib.error import URLError
from multiprocessing import Queue


User_Agent=["Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36",
            "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",
            "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
            "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; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
            'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0']
HEADERS = {
    'User-Agent':User_Agent,
    # 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:55.0) Gecko/201002201 Firefox/55.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate, br',
    'Cookie': '',
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache'
}
proxies = {
"http": "http://",
"https": "https://1.196.123.98:808",
}

def Ip(i, x): # 爬取ip
    try:
      r = requests.get('http://www.kuaidaili.com/free/inha/' + str(i) + '/', timeout=30)
      r.raise_for_status()
      r.encoding = r.apparent_encoding
      html = r.text
    except URLError as e:
      if hasattr(e, 'reason'):
            print('没有找到服务器')
            print('Reason:', 'e.reason')
      elif hasattr(e, 'code'):
            print('服务器无法完成请求')
            print('Error code', e.code)
    ip = r'<td data-title="IP">(.*?)</td>'
    port = r'<td data-title="PORT">(.*?)</td>'
    ip_list = re.findall(ip, html)
    port_list = re.findall(port, html)
    print(len(ip_list), len(port_list))
    for i in range(len(ip_list)):
      x.append(ip_list + ':' + port_list)
    return x

def Page(): # 确定爬取ip的页面数
    list_ip = []
    for i in range(1,2):
      list_ip = Ip(i,list_ip)
      time.sleep(3)
    return list_ip



def Scenic(ip_list):
    url = 'http://piao.qunar.com/ticket/detail_648971909.html?st=' \
          'a3clM0QlRTYlQjklOTglRTYlQkQlQUQlMjZpZCUzRDM3NDIlMjZ0eXBlJTNEMCUyNmlke' \
          'CUzRDMlMjZxdCUzRHJlZ2lvbiUyNmFwayUzRDIlMjZzYyUzRFdXVyUyNmFidHJhY2UlM0R' \
          'id2QlNDAlRTUlQTQlOTYlRTUlOUMlQjAlMjZ1ciUzRCVFNiVCOSU5NiVFNSU4RCU5NyUyNmxy' \
          'JTNEJUU2JUI5JTk4JUU2JUJEJUFEJTI2ZnQlM0QlN0IlN0Q%3D#from=mps_search_suggest_h'
    proxies['http'] = 'http://' +str(list_ip)
    response= requests.get(url,headers=HEADERS,allow_redirects=False,timeout=5).content.decode('utf-8')
    print(response)
    with open('ceshi2.txt', 'w') as f:
      f.write(response)


if __name__ == '__main__':
    list_ip = Page()
    Scenic(list_ip)
想写个爬数据的代码,这是写得一部分测试代码   但抓取的页面代码不全 后面评论区的基本没有,
前面也有一些空白的行 如:
                     <div class="mp-charact-desc">

                         <p>

                           

                              9:00~17:00开放;

                              

                           

                         </p>
我想问下:
1、怎么才能抓取完整的页面代码?
2、若抓取的是这样的页面,若我想匹配如上所说的信息“9:00~17:00开放;”,该如何写正则表达式或用其他方法怎么实现?
急求,有高手能帮忙解决吗?

gopythoner 发表于 2017-6-9 01:13:48

本帖最后由 gopythoner 于 2017-6-9 18:09 编辑

太阳花田 发表于 2017-6-9 17:54
方法一:继续使用正则,先把网页中的空格和换行符都替换掉,replace()函数知道吧,这个应该怎么写
另 ...

你的意思是你在网页中能够看到的信息,但是用爬虫爬下来的源代码是没有的对吧?
我看了一下,这个网站的价格等信息都是通过异步加载出来的 ,如果你会看F12的抓包信息的话,看看HXR这个里面的就知道了,是存在一个json格式里面的


请求这个http://piao.qunar.com/ticket/detail/getTickets.json链接(你直接请求是没用的,要提交表单),然后使用POST发送信息
表单信息是
sightId:3742
from:detail
supplierId:

gopythoner 发表于 2017-6-9 09:33:35

方法一:继续使用正则,先把网页中的空格和换行符都替换掉,replace()函数知道吧,
替换掉之后你得到的网页就是如下这样
<div class="mp-charact-desc"><p>9:00~17:00开放;</p>
到了这个地步然后再用正则匹配,搞定
方法二:使用BeautifulSoup4直接提取标签,这种做法就不用考虑空格的问题,因为会把<p>标签的信息都提取到,提取之后再用strip()函数去掉空格就行

太阳花田 发表于 2017-6-9 17:54:36

本帖最后由 太阳花田 于 2017-6-9 17:55 编辑

gopythoner 发表于 2017-6-9 09:33
方法一:继续使用正则,先把网页中的空格和换行符都替换掉,replace()函数知道吧,
替换掉之后你得到的网 ...

方法一:继续使用正则,先把网页中的空格和换行符都替换掉,replace()函数知道吧,这个应该怎么写
另怎样才能抓取完整的页面不说后面评论区的完全没有我抓取下来有的为什么好多缺失价格都没法看

太阳花田 发表于 2017-6-9 20:21:44

gopythoner 发表于 2017-6-9 18:06
你的意思是你在网页中能够看到的信息,但是用爬虫爬下来的源代码是没有的对吧?
我看了一下,这个网站 ...

按F12我去网络部分看了HXR,点击F5刷新确实有些信息在主页上没加载,但我在的GET里面好像也没有看到那些信息    旁边是消息头,响应,cookie,参数,耗时五个部分
另外我是不是先用requests.post提交表单之后再用get就能获得全部信息吗?另外表单上的三个参数代表什么意思,为什么最后一个supplierID后面是空的

太阳花田 发表于 2017-6-9 22:13:14

gopythoner 发表于 2017-6-9 21:20
哎,直接写给你算了




谢谢了,开始不知道为什么没有POST只有GET,刚刚在POST里找到了表单信息也在cookie里面找到了   
页: [1]
查看完整版本: Python 爬虫 正则