葡京赌场网址AC自动机—病毒袭击持续中

1.用于爬取58达之租房信息,限成都,其他地方的,可以管网址改改;

HDU 3065

2.这爬虫有一些题目,就是从未因此几近线程,因为自身为此了今后连续会报:
‘module’ object has no attribute
‘_strptime’这个奇怪之缪,挣扎了长久,放弃;

题材网址: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110773\#problem/C

假设有大神看到就篇帖子,希望得以指导一二,不胜感激,谢谢。

Description

3.自家自然打算做成EXE文件的,但是当华语处理者总是乱码,需要更研究;

小t非常感谢大家帮忙解决了他的达成一个题目。然而病毒侵袭持续受。在小t的不懈努力下,他发现了网路中之“万恶之源”。这是一个巨大的病毒网站,他有着许多居多的病毒,但是这网站包含的病毒很想得到,这些病毒之特征码很缺,而且光包含“英文大写字符”。当然小t好怀念吓怀念也公民除害,但是小t从来不打没有准备的烟尘。知己知彼,百征无殆,小t首先要开的是知道者病毒网站特点:包含多少不同的病毒,每种病毒出现了略微次。大家会更帮拉他啊?

以下也代码:

 

 

Input

#!/usr/bin/python
# -\
– encoding:utf-8 -*-

率先执行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 
连下去N行,每行表示一个病毒特征码,特征码字符串长度在1―50内,并且独自含“英文大写字符”。任意两个病毒特征码,不见面完全相同。 
当即时下一律执行,表示“万恶之源”网站源码,源码字符串长度在2000000内。字符串中字符都是ASCII码可见字符(不包回车)。 

*import requests
from bs4 import BeautifulSoup
from multiprocessing.dummy import Pool as ThreadPool
import re
import datetime
import sys
# from datetime import datetime reload(sys)
sys.setdefaultencoding(‘utf-8’)
#得soup,因后文通用,直接放大这儿就推行了
**
def urlBS(url):
    response=requests.get(url)
    response.encoding =
‘utf-8’
    soup = BeautifulSoup(response.text,“lxml”)
   
return** soup

 

#由此相互的道于追寻人输入想使的房子条件,不输给的口舌出默认值
**
def get_source_url():
    base_url=
‘http://cd.58.com/zufang/’  
#率先,锁定为整租:/zufang/,然后限定为私家房源:/0/,0为个人,1也商贩
   
# real_url=’http://cd.58.com/zufang/?isreal=true’
   
try:
       
source_key=input(
‘请按序号输入你想使的房来源,1乎不限,2为个人房源,3乎商户(默认为2单人口房源):\n’)
   
except:
        source_key=2
    source_from={1:
,2:‘0/’,3:‘1/’}    #
4:’?isreal=true’,4也诚信房源专区’
   
try:
       
price_min=str(input(
‘请输入而愿意之价下限(不输默认为500):\n’))
   
except:
        price_min=
‘500’
    try:
       
price_max=str(input(
‘请输入而盼之价钱上限(不输默认为1000):\n’))
   
except:
        price_max=
‘1000’
    price=‘minprice=’+price_min+‘_’+price_max
   
try:
       
room_key=input(
‘请输入你想要之房舍间数:0为不限,1吗1室,2吗2室,3吗3室,4呢4室,5呢4室以上(不输默认为1室):\n’)
   
except:
        room_key=1
   
room_num={0:
,1:‘j1/’,2:‘j2/’,3:‘j3/’,4:‘j4/’,5:‘j5/’**}

Output

   
key_words=raw_input(‘请输入而想使摸的别样关键词,如小区名称,地铁位置等(不输默认为空):\n’)

以以下格式每行一个,输出每个病毒出现次数。未出现的病毒未待输出。 
病毒特征码: 出现次数 
冒号后发生一个空格,按病毒特征码的输入顺序进行输出。 

   
source_url=base_url+source_from[source_key]+room_num[room_key]+‘?’+price+‘&key=’+key_words
    # print new_url
   
return source_url
#
new_url=’http://cd.58.com/zufang/0/j1/?minprice=600\_800&PGTID=0d300008-0006-6cd9-6ba7-a7672ec996c3&ClickID=3′
#找到下同样页的地址,因为58底网站大坑,它并无亮共多少页,所以只能通过爬取他的下一页对应的href来取得下一致页的链接
#可,更坑的凡,他的页面上后先是差的生一样页按了晚同时页是均等的,所以自己就算当规定来下一样页的动静下,直接用手上页+1得到下同样页的url
**
def get_new_list(source_url):
    new_url=source_url
    new_url_list=[new_url]
   
while True:
        soup=urlBS(new_url)
        cp=re.compile(
r’/pn(.)/’)
        finder=soup.find(
‘a’,{‘class’:‘next’})
       
if finder:
            next_url=finder[
‘href’]
            now_page=cp.findall(source_url)
            next_page=
‘http://cd.58.com'**+next\_url
            if now_page:
                now_page=now_page[0]
                newpage=str(int(now_page)+1)
                new_page=cp.sub(newpage,next_page)
            else:
                now_page=‘1’
               
newpage=‘2’
                
new_page=‘http://cd.58.com’+next_url
            new_url=new_page

 

        else:
            new_page=
           
break
       
*# else:
        #     print ‘dont have next page’
        # print new_url

Sample Input

       * if len(new_url_list)==1:
            new_url_list.append(new_url)
        elif new_page==new_url_list[-1]:
            break
        else
:
            new_url_list.append(new_url)

3 AA BB CC ooxxCC%dAAAoen….END

    # print new_url_list
   
return new_url_list
#得到房屋信息页的链接
**
def get_house_url(new_url):
    soup = urlBS(new_url)
    href_list=soup.select(
‘div[class=”img_list”] a’)
    house_url_list=[]
   
for each in href_list:
        href=each[
‘href’]
        #print href
       
house_url_list.append(href)
   
return house_url_list
#爬取房屋信息,同时不要那些骗子的信,以及一个月前更新的音
def house_info(house_url):
   #
house_url=’http://cd.58.com/zufang/26364594760504x.shtml?version=A&psid=162154127192148068945806804&entinfo=26364594760504\_0′
   #  print house_url
   
soup=urlBS(house_url)
   
try:
        tel=soup.find(
‘span’,{‘class’:‘tel-num tel-num-geren
pl30 f30’}).text       #私家房源
   
except:
        tel=soup.find(
‘span’,{‘class’:‘tel-num pl30
f30’*}).text                     #中介

 

    match_tel=re.search(**r’^1\d{5}.\,tel)
#排拥有电话号码以0开始之人数,即留固定电话的人头,因为咱们当,固定房源的人口是休见面留给固定电话的
   

situation=soup.find(
‘div’,{‘class’:‘description-content’}).text.strip()
    # print situation
   

match_si=re.search(
u'(我是房东|男士不扰|男生勿扰|限女生|微信|男士|男性|男生|女性|女的|姐妹|”+”)’,situation)
    #履新时间
   
update_time=soup.find(
‘span’,{‘class’:‘pl10’}).text
    update_date =
datetime.datetime.strptime(update_time.replace(
‘更新时间:’,),“%Y-%m-%d”**).date()
    thirtyDayAgo=datetime.date.today() + datetime.timedelta(days=-30)
    day_line=(update_date – thirtyDayAgo).days

Sample Output

    if not match_tel:  
#看隐藏了电话号码的,电话号码以0开始之,都是骗子,不要他
        # print ‘电话号码有问题,骗子’
       
pass
    elif
match_si:      #觉得包含某些字之总体吧骗子,把这些免除掉
       
# print ‘内容有问题,骗子’
       
pass
    elif
day_line<0:   
#取近30上更新的数量,时间最长了之数尚未啥意思
       
# print ‘已经是一个月份前的信息了’
       
pass
    else
:
        print house_url
        print situation
        print tel
        #标题
       
title=soup.find(‘h1’,{‘class’:‘main-title
font-heiti’
}).text
        print title
        #价格
       
p=re.compile(r’\n|\t|\r| ‘)
        rent_price=soup.find(‘i’,{‘class’:‘ncolor’}).text
        price=p.sub(,rent_price)
        print price
        #房屋大小
       

house=soup.find_all(‘li’,{‘class’:‘house-primary-content-li
clearfix’
})

AA: 2 CC: 1

        house_content=p.sub(,house[0].text)
        print house_content
        #小区
       
try:
            house_Community=p.sub(,house[1].text)
        except:
            house_Community=
       
print house_Community
        #位置
       
try:
            house_place=p.sub(,house[2].text)
        except:
            house_place=
       
print house_place
        #设施
       
try:
           
facility=soup.find(‘li’,{‘class’:‘house-primary-content-li
clearfix person-config’
})
            facility=p.sub(,facility.text)
        except:
            facility=
       
print facility
        #联系人
       

contact=soup.find(‘li’,{‘class’:‘house-primary-content-li
clearfix person-contact’
}).text
        contact=p.sub(,contact)
        print contact
        print update_time+‘\n\n\n’
       
#
a=[house_url,price,house_content,house_Community,house_place,title,situation,facility]
       

f.write(‘———————————————————————————-\n’)
       
f.write(house_url+‘\n’+price+‘\n’+house_content+‘\n’+house_Community+‘\n’+house_place+‘\n’+title+‘\n’+situation+‘\n’+facility+‘\n\n’)

Hint

if __name__==‘__main__’:
    source_url=get_source_url()
    print source_url
    #
source_url=’http://cd.58.com/zufang/0/?minprice=500\_1500&key=四河’
   
get_new_list=get_new_list(source_url)
    *# print get_new_list

 Hit: 题目描述中没有被提及的所有情况都应该进行考虑。比如两个病毒特征码可能有相互包含或者有重叠的特征码段。 计数策略也可一定程度上从Sample中推测。 

思路: 这题要注意多组输入,上一题不用多组输入就过了,这题居然必须多组输入…… 还有要注意每个测试样例结束后要要将结构体空间清理掉,否则会超内存。 解题过程,在AC自动机模板上在结构体中加一个标记,用来标记模式串(病毒的特征码)的序号。在计数过程中,不用把模式串标记为-1,因为要重复计数。

代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 50010
char str[2000010],keyword[1005][55];
int head,tail;
int C[1005];

struct node
{
    node *fail;
    node *next[95];
    int b;
    int count;
    node()
    {
        fail=NULL;
        b=0;
        count=-1;
        for(int i=0; i<95; i++)
            next[i]=NULL;
    }
}*q[N];
node *root;

void insert(char *str,int x) ///建立Trie
{
    int temp,len;
    node *p=root;
    len=strlen(str);
    for(int i=0; i<len; i++)
    {
        temp=str[i]-32;
        if(p->next[temp]==NULL)
            p->next[temp]=new node();
        p=p->next[temp];
    }
    p->count++;
    p->b=x;///在该串结束字符位置标记该串的序号;
}

void setfail() ///使用bfs初始化fail指针;
{
    q[tail++]=root;
    while(head!=tail)
    {
        node *p=q[head++];
        node *temp=NULL;
        for(int i=0; i<95; i++)
            if(p->next[i]!=NULL)
            {
                if(p==root) ///首字母的fail必指向根
                    p->next[i]->fail=root;
                else
                {
                    temp=p->fail; ///失败指针
                    while(temp!=NULL) ///2种情况结束:匹配为空or找到匹配
                    {
                        if(temp->next[i]!=NULL) ///找到匹配
                        {
                            p->next[i]->fail=temp->next[i];
                            break;
                        }
                        temp=temp->fail;
                    }
                    if(temp==NULL) ///为空则从头匹配
                        p->next[i]->fail=root;
                }
                q[tail++]=p->next[i]; ///入队(p->next[i]的fail指针已设置m完);
            }
    }
}

void query()
{
    int index,len;
    node *p=root;
    len=strlen(str);
    for(int i=0; i<len; i++)
    {
        index=str[i]-32;
        while(p->next[index]==NULL&&p!=root) p=p->fail;///跳转失败指针
        p=p->next[index];
        if(p==NULL)
            p=root;
        node *temp=p; ///p不动,temp计算后缀串
        while(temp!=root&&temp->count!=-1)
        {
            C[temp->b]++;
            temp=temp->fail;
        }
    }
    return ;
}

void free_(node *r)
{
    for(int i=0;i<95;i++)
    {
        if(r->next[i])
        free_(r->next[i]);
    }
    free(r);
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(C,0,sizeof(C));
        getchar();
        head=tail=0;
        root=new node();
        for(int i=1; i<=n; i++)
        {
            gets(keyword[i]);
            insert(keyword[i],i);
        }
        setfail();
        gets(str);
        query();
        for(int i=1; i<=n; i++)
        if(C[i]) printf("%s: %d\n",keyword[i],C[i]);
        free_(root);///释放开辟的结构体空间;
    }
    return 0;
}

    f=open(“house_rent.txt”, “w”)       #优先清空,然后重新打开,再写副,写副常之法子是a(追加)
    # f.truncate()
    # f.close()
    #
    # f=open(“house_rent.text”, “a”)

 

    print ‘正在下载,请稍候。。。\n\n’
   
# pool = ThreadPool(4)
    for new_url in get_new_list:
        new_url=new_url.encode(‘utf-8’).decode(‘utf-8’)
       
# print new_url
        house_url_list=get_house_url(new_url)
       
# print house_url_list
        for each in house_url_list:    #当然打算用多线程,但是接连会报: ‘module’ object has no attribute
‘_strptime’这个意外的谬误,挣扎了旷日持久,放弃
            house_info(each)
   
#     results = pool.map(house_info, house_url_list)
    # pool.close()
    # pool.join()

   * f.close()